Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将受保护的抽象方法重新定义为私有方法_Delphi_Oop - Fatal编程技术网

Delphi 将受保护的抽象方法重新定义为私有方法

Delphi 将受保护的抽象方法重新定义为私有方法,delphi,oop,Delphi,Oop,我有一个抽象类,其中在受保护部分声明了一个抽象方法。 我可以在其子级中将此方法重新定义为private吗 它看起来合乎逻辑-在抽象类中,此方法应受到保护,以使其可供儿童使用 (仅限儿童); 但是在子类中,这个方法可以是私有的,它(方法)不在这个类的对象之外调用 我可以这样做吗?你确实可以这样做 type TMyAbstractBase = class protected procedure Foo; virtual; abstract; public procedur

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

它看起来合乎逻辑-在抽象类中,此方法应受到保护,以使其可供儿童使用 (仅限儿童); 但是在子类中,这个方法可以是私有的,它(方法)不在这个类的对象之外调用


我可以这样做吗?

你确实可以这样做

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}
包围允许的一个呼叫站点(即在专用包装中)。