【问题标题】:Can I hold any data members in abstract base class?我可以在抽象基类中保存任何数据成员吗?
【发布时间】:2008-11-30 21:38:47
【问题描述】:

我有一个抽象类:

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;

如果我能做到,从面向对象设计的角度来看会不会很好,我怎样才能从派生类中准确地访问这个成员?

【问题讨论】:

    标签: delphi oop inheritance


    【解决方案1】:

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

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

    可以实例化具有抽象方法的类,但这会导致编译时出现警告,如果调用该方法则会引发异常。

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

    【讨论】:

      【解决方案2】:

      只是为了添加到 Gamecat 的答案中,不仅你可以,而且你应该把你的通用代码放在那里。

      【讨论】:

      • 如何从派生类访问基类私有成员? (上)
      • 方法找到了——我只需要声明基类私有成员为protected:)
      • 您可以访问在同一单元中定义的类的私有成员。为了避免这种情况,请使用严格私有(和严格保护)
      • Chester,这就是受保护说明符的具体用途,以便您的派生类可以使用它们,实际上这有点暗示您希望派生类使用该受保护的实例数据。
      • 事实上 Destroy 应该总是被覆盖,因为它在 TObject 中是虚拟的。析构函数 销毁;覆盖;
      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2013-04-10
      • 2021-03-17
      相关资源
      最近更新 更多