Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我可以在抽象基类中保存任何数据成员吗?_Delphi_Oop_Inheritance - Fatal编程技术网

Delphi 我可以在抽象基类中保存任何数据成员吗?

Delphi 我可以在抽象基类中保存任何数据成员吗?,delphi,oop,inheritance,Delphi,Oop,Inheritance,我有一个抽象类: type TInterfaceMethod = class abstract public destructor Destroy; virtual; abstract; function GetBasePlan: Word; virtual; abstract; procedure CountBasePlan; virtual; abstract; procedure Calculate; virtua

我有一个抽象类:

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;

如果我能做到这一点,从面向对象设计的角度来看,这是否很好?我如何才能从派生类中准确地访问此成员?

是的,您可以。抽象类是类,它们可以有实现

通过向类添加abstract关键字,可以禁止实例化该类。它不需要任何抽象方法

可以实例化具有absract方法的类,但这会在编译时导致警告,如果调用该方法,则会导致异常


接口没有实现,它们必须由类实现(顺便说一句,类可以是抽象的)。

为了补充Gamecat的答案,不仅可以,而且应该将您的通用代码放在那里。

如何从派生类访问基类私有成员?(上图)找到了方法-我只需要将基类私有成员声明为受保护:)您可以访问在同一单元中定义的类的私有成员。为了避免这种情况,请使用严格私有(和严格保护)的Chester,这就是受保护说明符的具体用途,以便派生类可以使用它们,事实上,这有点意味着您希望派生类使用受保护的实例数据。事实上,应该始终避免使用Destroy,因为它在ToObject中是虚拟的。毁灭者毁灭;推翻