Delphi中的自定义继承,我们可以优雅的做吗?

看看这个代码:

    TSuper = class   // An Ancestor Class.
  public
    procedure Commonmethod; // The Ancestor Common Method for All.
    procedure GroupSpecificMethod; // The Ancestor Specific Method.
  end;

  TSubOne = class(TSuper)  // A Subclass needs to implement GroupSpecificMethod.
  public
    procedure Commonmethod; 
    procedure GroupSpecificMethod; 
  end;

  TSubTwo = class(TSuper) // Another Subclass needs to implement GroupSpecificMethod.
  public
    procedure Commonmethod; 
    procedure GroupSpecificMethod; 
  end;

  TSubThree = class(TSuper) // This class Must not have GroupSpecificMethod.
  public
    procedure Commonmethod; 
  end;

我们有一个 SuperClass,它提供了一组子类的起源。

我们如何强制将 GroupSpecificMethod 从祖先类继承到某些子类而不是所有子类。

我需要以一种优雅的方式来避免在子类中引入 Empty 方法。

Delphi 中的 OOP 支持吗?怎么样?

yingjianfeng09 回答:Delphi中的自定义继承,我们可以优雅的做吗?

在 Delphi 中(可能在任何 OO 语言中)都无法自动清空层次结构中某个类下面的方法的实现。有两个原因:

  1. 您始终可以通过使用空值覆盖该方法来自己完成 实施。

  2. 这种需求非常少见,可能是层次结构设计不当的标志。

,

您的愿望违反了 OOP 原则。您的应用似乎存在架构问题..

,

这就是 Visibility of class members 派上用场的地方。

如果您希望您的 GroupSpecificMethod 仅在其某些子类中可见,请在您的 private 类中将其声明为 strict privateTSuper

  TSuper = class   // An Ancestor Class.
  strict private
    procedure GroupSpecificMethod; // The Ancestor Specific Method declared as strict private.
  public
    procedure CommonMethod; // The Ancestor Common Method for All.
  end;

  TSubOne = class(TSuper)  // A Subclass needs to implement GroupSpecificMethod.
  public
    procedure CommonMethod;
    procedure GroupSpecificMethod; // The Ancestor Specific Method visibility changed to public
  end;

  TSubTwo = class(TSuper) // Another Subclass needs to implement GroupSpecificMethod.
  public
    procedure CommonMethod;
    procedure GroupSpecificMethod; // The Ancestor Specific Method visibility changed to public
  end;

  TSubThree = class(TSuper) // This class Must not have GroupSpecificMethod.
  public
    procedure CommonMethod;
  end;

注意:

  • 这可以防止直接从 GroupSpecificMethod 使用 TSuper。所以你总是需要子类化 TSuper 才能使用 GroupSpecificMethod
  • 此外,这不会阻止 TSubThree 的任何子类公开 GroupSpecificMethod
本文链接:https://www.f2er.com/2931.html

大家都在问