Могу ли я хранить какие-либо члены данных в абстрактном базовом классе? - PullRequest
3 голосов
/ 01 декабря 2008

У меня есть абстрактный класс:

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 в базовый класс, сделать их только виртуальными - не абстрактными, как сейчас - и также поместить туда элемент BasePlan? Итак, могу ли я сделать это:

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;

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

Ответы [ 2 ]

8 голосов
/ 01 декабря 2008

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

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

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

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

7 голосов
/ 01 декабря 2008

Просто чтобы добавить к ответу Gamecat, вы не только можете, но и поместите туда свой общий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...