0

我有一个抽象类,其中在受保护的部分中声明了一个抽象方法。我可以在它的孩子中将此方法重新定义为私有吗?

从逻辑上看——在抽象类中,这个方法应该被保护为对孩子可用(并且只对孩子可用);但是在孩子中,这个方法可以是私有的,它(方法)不会在这个类的对象之外调用。

我可以这样做吗?

4

1 回答 1

1

你确实可以这样做。

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是私人的。

所以,我的建议是,虽然你提出的建议是可能的,但你不要这样做。根据经验,您应该避免降低成员的可见性。

于 2013-02-26T14:27:00.337 回答