2008-11-30 2 views
3

У меня есть абстрактный класс:Могу ли я хранить данные в абстрактном базовом классе?

type 
    TInterfaceMethod = class abstract 
    public 
    destructor Destroy;   virtual; abstract; 
    function GetBasePlan: Word; virtual; abstract; 
    procedure CountBasePlan; virtual; abstract; 
    procedure Calculate;  virtual; abstract; 
    procedure PrepareForWork; virtual; abstract; 
    end; 

и производный класс:

type 
    TFogelMethod = class(TInterfaceMethod) 
    private 
    matrix: TFogelMatrix; 
    BasePlan: Word; 
    public 
    constructor Create(var matr: TFogelMatrix); 
    procedure Calculate; 
    function GetBasePlan: Word; 
    procedure CountBasePlan; 
    procedure PrepareForWork; 
    destructor Destroy; 
    end; 

Вопрос заключается в том, могу ли я поставить реализацию GetBasePlan и CountBasePlan методов в базовый класс, сделать их только виртуальный - не абстрактно, как сейчас, - а также разместить там базовый план? Таким образом, я могу это сделать:

type 
    TInterfaceMethod = class abstract 
    private 
    BasePlan: Word; 
    public 
    destructor Destroy;   virtual; abstract; 
    function GetBasePlan: Word; virtual; 
    procedure CountBasePlan; virtual; 
    procedure Calculate;  virtual; abstract; 
    procedure PrepareForWork; virtual; abstract; 
    end; 

В случае, если я могу это сделать, это будет хорошо с точки зрения объектно-ориентированного проектирования, и как я могу точно этот элемент из производных классов?

ответ

8

Да, вы можете. Абстрактные классы - это классы, и они могут иметь реализации.

Добавив абстрактное ключевое слово в класс, вы запрещаете экземпляр класса. Он не требует наличия абстрактных методов.

Класс с методами абстракции может быть создан, но это приводит к предупреждению во время компиляции и исключению, если вызван метод.

Интерфейсы не имеют реализации, они должны быть реализованы классами (которые могут быть абстрактными кстати).

7

Чтобы добавить ответ Gamecat, вы не только можете, но и разместите свой общий код.

+0

Спасибо за добавление ;-) – 2008-11-30 21:47:53