Абстрактный класс в Delphi - PullRequest
15 голосов
/ 31 мая 2011

Я использую набор компонентов, который имеет много абстрактных классов. Теперь я хочу применить полиморфизм, но я получаю Error Abstract Class, когда создаю свой объект.

Должен ли я переопределить все виртуальные методы, даже если они мне не нужны? Есть ли обходной путь или решение?

Ответы [ 4 ]

25 голосов
/ 31 мая 2011

Чтобы создать экземпляр класса, вам необходимо переопределить все методы, которые объявлены как виртуальные абстрактные.Даже если вы их не используете.

Если вы действительно хотите обойти это, вы можете использовать пустые методы.Но я не буду рекомендовать это.

И добавить еще немного информации по теме:

Метод является абстрактным, если он объявлен с помощью виртуального резюме:

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;
5 голосов
/ 31 мая 2011

Delphi не имеет абстрактных классов как таковых, только абстрактные методы.Вы получите исключение абстрактного метода, если вызовете абстрактный метод.

Проще говоря, вы не должны вызывать абстрактные методы.Компилятор генерирует потепление, если обнаруживает, что вы создаете экземпляр класса с помощью абстрактных методов.Хорошей практикой является попросить компилятор превратить эти предупреждения в ошибки.

1 голос
/ 31 мая 2011

Ваш класс-потомок по-прежнему абстрактный, если

  1. объявлен abstract или
  2. , у него есть хотя бы один метод, объявленный как абстрактный, или
  3. нетпереопределить и реализовать все абстрактные методы от своих предков
0 голосов
/ 06 августа 2013

Это приведет к ошибке, если вы переопределите абстрактный конструктор, поскольку он автоматически помещает наследуемый в новый конструктор, который, конечно, вызывает абстрактный конструктор, если вы используете код автозаполнения.

например,

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;
...