Delphi 将受保护的抽象方法重新定义为私有方法
我有一个抽象类,其中在受保护部分声明了一个抽象方法。 我可以在其子级中将此方法重新定义为private吗 它看起来合乎逻辑-在抽象类中,此方法应受到保护,以使其可供儿童使用 (仅限儿童); 但是在子类中,这个方法可以是私有的,它(方法)不在这个类的对象之外调用Delphi 将受保护的抽象方法重新定义为私有方法,delphi,oop,Delphi,Oop,我有一个抽象类,其中在受保护部分声明了一个抽象方法。 我可以在其子级中将此方法重新定义为private吗 它看起来合乎逻辑-在抽象类中,此方法应受到保护,以使其可供儿童使用 (仅限儿童); 但是在子类中,这个方法可以是私有的,它(方法)不在这个类的对象之外调用 我可以这样做吗?你确实可以这样做 type TMyAbstractBase = class protected procedure Foo; virtual; abstract; public procedur
我可以这样做吗?你确实可以这样做
type
TMyAbstractBase = class
protected
procedure Foo; virtual; abstract;
public
procedure DoFoo;
end;
TMyDerived = class(TMyAbstractBase)
private
procedure Foo; override;
end;
procedure TMyAbstractBase.DoFoo;
begin
Foo;
end;
procedure TMyDerived.Foo;
begin
Writeln('TMyDerived.Foo');
end;
那么以下代码(当然位于不同的单元中)将无法编译:
var
obj: TMyDerived;
....
obj.Foo;//[dcc32 Error]: E2361 Cannot access private symbol TMyDerived.Foo
但这样做不是个好主意。现在考虑这个类,再次声明在不同的单元中。
type
TMyDerived2 = class(TMyDerived)
public
procedure Foo; override;
end;
procedure TMyDerived2.Foo;
begin
inherited;//this does nothing
Writeln('TMyDerived2.Foo');
end;
如果执行过TMyDerived2.Foo
,则继承的语句不会执行任何操作。这是因为tmydrived.Foo
是私有的
因此,我的建议是,虽然你的建议是可能的,但你不要这样做。作为经验法则,您应该避免降低成员的可见性。这里的关键语句是“位于不同的单元”,对于初学者来说可能不太明显。为什么不将其设置为严格的私有
,而不是注释呢?关于TMyAbstractBase(obj)。Foo
或(obj作为TMyAbstractBase)。Foo
?看起来像是编译器错误。如果你想使一个方法最终被密封,那么只需将其标记为“严格私有”。将其设置为严格私有
,那么就不需要另一个单元了。在tmyderive中将Foo重新声明为私有不会产生编译器提示或警告“方法的可见性低于祖先”(或类似的东西)?一个稍微不同的解决方案,不太优雅,但不依赖于编译器的神秘知识,可能是将方法一分为二-给受保护的方法一个可怕的名称,以警告潜在的调用方,并通过一个带有“正常”的小包装方法提供对它的访问name.Addition:将受保护的方法命名为丑陋的,而将其标记为已弃用的。用{$WARN SYMBOL\u DEPRECATED OFF}
/{$WARN SYMBOL\u DEPRECATED ON}
包围允许的一个呼叫站点(即在专用包装中)。