为啥我的子类没有继承父类的所有方法?

Posted

技术标签:

【中文标题】为啥我的子类没有继承父类的所有方法?【英文标题】:Why my child class doesn't inherit all methods from the parent class?为什么我的子类没有继承父类的所有方法? 【发布时间】:2009-07-16 09:58:25 【问题描述】:

如果两个类都放在一个单元中-没问题,子类继承父类的私有方法,但是如果它们在不同单元中,则该类只能访问公共方法。为什么?

子类不能访问私有方法只是因为它们在不同的单元中。

如何避免这种情况?就我而言,我有 3 个子类,如果我把它们都放在父类的单元中,结果会非常大。

如何让子类以不同的单元从父类继承私有方法?

谢谢!

【问题讨论】:

【参考方案1】:

私有方法是(单位)私有的。您需要的是一种受保护的方法。任何从基类继承的类都可以访问受保护的方法,即使它们位于不同的单元中。用户代码无法访问它们(除非他从类继承)。

unit A;

interface

type
  TBase = class(TObject)
  private
    procedure PrivateTest;
  protected
    procedure ProtectedTest;
  end;

implementation

procedure TBase.PrivateTest;
begin
end;

procedure TBase.ProtectedTest;
begin
end;

end.

#

unit B;

interface

uses
  A;

type
  TDerived = class(TBase)
  public
    procedure Test;
  end;

implementation

procedure TDerived.Test;
begin
  // PrivateTest; // compile error
  ProtectedTest; // accepted by the compiler
end;

end.

#

unit C;

interface

uses
  A, B;

implementation

var
  Base: TBase;
  Derived: TDerived;

initialization
  Base := TBase.Create;
  Derived := TDerived.Create;

  // Base.PrivateTest; // compile error
  // Base.ProtectedTest; // compile error
  // Derived.PrivateTest; // compile error
  // Derived.ProtectedTest; // compile error
  Derived.Test; // accepted by the compiler

  Derived.Free;
  Base.Free;
end;

【讨论】:

从 Delphi 2006 开始,还有一个 strict 修饰符(如 strict private)。使用此修饰符,私有/受保护的工作就像在 c++ 中一样(严格私有 - 没有任何外部类可以访问该方法,严格保护 - 只有类和子类可以访问该方法)。 Tobias,这是 Delphi 2005,而不是 2006。【参考方案2】:

这是类方法范围的遗留问题。严格来说,PRIVATE 方法永远不应该在其他类中可见,但在他们的智慧中,Borland 在同一个单元中使这成为可能,可能是为了与 FORWARD 声明兼容。随后,创建了许多利用此功能的代码。为了强制执行这一点,Delphi 现在引入了 STRICT PRIVATE,它可以在不破坏现有代码的情况下将事情带到他们应该一直的状态。 布里

【讨论】:

【参考方案3】:

您应该将它们设为Protected,而不是Private

像这样

type 
TMyClass = class(TObject)
Private
   procedure OnlyAccessedViaThisClass;
Protected
   procedure OnlyAccessedViaThisClassOrSubClasses;
Public
   procedure AccessedByAnyone;
end;

【讨论】:

【参考方案4】:

您的类无法访问这些方法,因为它们是祖先类的私有方法。您需要阅读有关公共、私人和受保护可见性的帮助文件。如果您需要在后代中使用这些方法,请重新编写您的类,以便保护这些方法。

【讨论】:

以上是关于为啥我的子类没有继承父类的所有方法?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中,子类将继承父类的所有属性和方法吗?为啥?

子类将继承父类所有的方法和属性吗?为啥?

在JAVA中,子类继承父类,父类可以调用子类继承父类的方法,父类为啥不能调用子类自己定义的方法呢

java中子类继承了父类就可以使用父类的方法了,那为啥还要用super?

java中子类继承了父类就可以使用父类的方法了,那为啥还要用super?

java 既然子类能继承父类的所有属性与方法,那子类不能不定义成员变量?