详细阐述问题的最佳方式是举例说明我正在尝试做什么......
我定义了一个“基类”:
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语言中不存在关键字“已提升”。是否有一个关键字具有相同的效果,我只是不知道?
谢谢!
答案 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;