Абстрактный класс в Delphi
Я использую набор компонентов, который имеет много абстрактных классов. Теперь я хочу применить полиморфизм, но я получаю Error Abstract Class, когда создаю свой объект.
Должен ли я переопределить все методы, которые являются виртуальными, даже если мне это не нужно? Есть ли какое-либо решение или решение?
Ответы
Ответ 1
Чтобы создать экземпляр класса, вам необходимо переопределить все методы, объявленные как виртуальные абстрактные. Даже если вы их не используете.
Если вам действительно нужна работа, вы можете использовать пустые методы. Но я не буду рекомендовать это.
И добавить дополнительную информацию по этому вопросу:
Метод абстрактный, если он объявлен с помощью виртуального абстрактного:
procedure MyMethod(const AMyParameter: Integer); virtual; abstract;
Общая информация: вы можете даже переопределить метод как абстрактный:
procedure MyMethod(const AMyParameter: Integer); override; abstract;
Вам необходимо переопределить эти методы, чтобы создать экземпляр из этого класса.
И вы можете объявить целый класс абстрактным:
type
TMyClass = class abstract (TMyAncestor)
end;
Вы получите предупреждение, если попытаетесь создать экземпляр этого класса.
Этот экземпляр является закрытым классом:
type
TMyClass = class sealed (TMyAncestor)
end;
Появляется предупреждение, если вы пытаетесь наследовать этот класс.
Вы также можете запечатать методы, но для этого вам потребуется ключевое слово final.
procedure MyMethod(const AMyParameter: Integer); override; final;
Ответ 2
Delphi не имеет абстрактных классов как таковых, а только абстрактных методов. Вы получите исключение абстрактного метода, если вы вызываете абстрактный метод.
Проще говоря, вы не должны называть абстрактные методы. Компилятор испускает потепление, если обнаруживает, что вы создаете экземпляр класса абстрактными методами. Хорошая практика - попросить компилятор включить эти предупреждения в ошибки.
Ответ 3
Ваш класс потомков остается абстрактным, если
- объявлено
abstract
, или
- у него есть хотя бы один метод, объявленный абстрактом, или
- он не переопределяет и не реализует все абстрактные методы от своих предков
Ответ 4
Он выдает ошибку, если вы переопределяете конструктор абзацев, поскольку он автоматически помещает унаследованный в новый конструктор, который, конечно, вызывает абстрактный конструктор, если вы используете код auto complete.
например.
type
TMyclass = class (TObject)
public
constructor Create(AOwner : TComponent); dynamic; abstract;
end;
TMyclass2 = class(TMyclass)
public
Constructor Create(AOwner : TComponent); override;
end;
implementation
constructor TMyclass2.Create(AOwner: TComponent);
begin
inherited;
end;