В последнее время я немного запутался с интерфейсами и абстрактными классами, и я чувствую, что не до конца понимаю, как думал. Я думаю, что я использую их неправильно. Я опишу то, что я делаю в данный момент, проблему, с которой я столкнулся, и тогда, надеюсь, будет ясно, что я делаю неправильно, если что-нибудь.
Я хотел написать несколько классов, которые бы занимались разбором xml. У меня есть разные типы пользователей, которые имеют разные требования к синтаксическому анализу.
Моя логика заключалась в следующем.
Все парсеры имеют общую функцию "разбора" и должны иметь хотя бы эту функцию, поэтому я создал интерфейс с этой функцией, определенной с именем IParse;
Я начинаю с 2 пользовательских типов, пользовательского типа A и пользовательского типа B. Пользовательский тип A & B имеет некоторые основные функции, но пользовательский тип B имеет несколько больше функций, чем A, поэтому я поместил функции для анализа того, что они разделяют, абстрактный класс, который будет расширяться, называется "ParseBase".
Так что теперь у меня есть
// Interface
public interface IParser
{
function parse(xml:XML):void;
}
// Base Class
public class ParseBase()
{
public function getbasicdata():void{}
public function getmorebasicdata():void{}
}
//User type A
public class userTypeA extends ParseBase implement IParse
{
public function parse(xml:XML):void
{
getbasicdata()
getmorebasicdata()
}
}
//user type B
public class userTypeB extends ParseBase implement IParse
{
public function parse(xml:XML):void
{
getbasicdata()
getmorebasicdata()
}
public function extraFunctionForB():void
{
}
public function anotherExtraFunctionForB():void
{
}
}
Проблема, с которой я столкнулся сейчас, заставляет меня поверить, что я делаю что-то не так, заключается в следующем.
Допустим, я хочу добавить еще одну функцию UserTypeB. Я иду и пишу новую публичную функцию в этом классе. Затем в моей реализации я использую переключатель, чтобы проверить, какой тип пользователя создать.
Var userParser:IParser
if(a)
{
userParser= new userTypeA();
}else if(b)
{
userParser= new userTypeB();
}
Если я попытаюсь получить доступ к этой новой функции, я не увижу ее в подсказке к коду. Я вижу только имена функций, определенные в интерфейсе.
Что я делаю не так?