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 下面的方法的实现。有两个原因:
你总是可以通过用一个空的重写方法来自己做
实施。
这种需求非常罕见,可能是层次结构设计不当的标志。
这就是 Visibility of class members 派上用场的地方。
如果您希望您的 GroupSpecificMethod
仅在其某些子 class 中可见,请在您的 TSuper
中将其声明为 private
或 strict 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 原则。您的应用程序似乎存在架构问题..
看这段代码:
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 下面的方法的实现。有两个原因:
你总是可以通过用一个空的重写方法来自己做 实施。
这种需求非常罕见,可能是层次结构设计不当的标志。
这就是 Visibility of class members 派上用场的地方。
如果您希望您的 GroupSpecificMethod
仅在其某些子 class 中可见,请在您的 TSuper
中将其声明为 private
或 strict 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
使用。所以你总是需要 subclassTSuper
才能使用GroupSpecificMethod
- 此外,这不会阻止 TSubThree 的任何子 class 生成
GroupSpecificMethod
public.
您的愿望违反了 OOP 原则。您的应用程序似乎存在架构问题..