提升后代类中方法可见性的最佳方法

时间:2011-11-22 20:00:30

标签: delphi

详细阐述问题的最佳方式是举例说明我正在尝试做什么......

我定义了一个“基类”:

TMyBaseClass = class(TPersistent)
protected
  procedure Foo(const AValue: String); virtual;
  // more methods here (many more in fact)
end;

我现在定义一个后代类:

TMyDescendantClass = class(TMyBaseClass)
public
  procedure Foo(const AValue: String); override;
  // etc. for all desired methods I wish to elevate into Public
end;

这里的问题是我必须重新定义TMyDescendantClass的方法“Foo”以将链调用传递给TMyBaseClass:

procedure TMyDescendantClass.Foo(const AValue: String);
begin
  inherited;
end;

这是浪费空间!我想知道是否有人知道任何方式来否定重新实现该方法的需要并且“继承”。

理想的解决方案如下:

TMyDescendantClass = class(TMyBaseClass)
public
  procedure Foo(const AValue: String); elevated;
  // etc. for all desired methods
end;

显然这是假设,我知道Delphi语言中不存在关键字“已提升”。是否有一个关键字具有相同的效果,我只是不知道?

谢谢!

2 个答案:

答案 0 :(得分:6)

没有这样的关键字。你可以轻而易举地change the visibility of a property by redeclaring it with a new visibility level。但是没有类似的方法。

答案 1 :(得分:3)

您是否听说过受保护的黑客

在您的情况下,您只需在要调用受保护方法的同一单元中创建派生类,如下所示:

TMyDescendantClass = class(TMyBaseClass);

然后,调用受保护的方法:

TMyDescendentClass(myObject).Foo;

您可以通过隐藏原始类来进一步避免类型转换:

TMyBaseClass = class(UnitName.TMyBaseClass);

然后,它只是:

myObject.Foo;