我有一个抽象类,其中在受保护的部分中声明了一个抽象方法。我可以在它的孩子中将此方法重新定义为私有吗?
从逻辑上看——在抽象类中,这个方法应该被保护为对孩子可用(并且只对孩子可用);但是在孩子中,这个方法可以是私有的,它(方法)不会在这个类的对象之外调用。
我可以这样做吗?
你确实可以这样做。
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
曾经执行,那么该inherited
语句什么也不做。那是因为TMyDerived.Foo
是私人的。
所以,我的建议是,虽然你提出的建议是可能的,但你不要这样做。根据经验,您应该避免降低成员的可见性。