Delphi 中的自定义继承,能不能优雅的实现?

Custom Inheritance in Delphi , Can we do it in an elegant way?

看这段代码:

    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 从祖先 Class 继承到某些子类而不是所有子类。

我需要一种优雅的方式,不要在子类中引入 Empty 方法。

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

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

  1. 你总是可以通过用一个空的重写方法来自己做 实施。

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

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

如果您希望您的 GroupSpecificMethod 仅在其某些子 class 中可见,请在您的 TSuper 中将其声明为 privatestrict private class.

  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 使用。所以你总是需要 subclass TSuper 才能使用 GroupSpecificMethod
  • 此外,这不会阻止 TSubThree 的任何子 class 生成 GroupSpecificMethod public.

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