为什么我的子类不继承父类的所有方法?

时间:2009-07-16 09:58:26

标签: delphi class

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

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

我该如何避免这种情况?在我的情况下,我有3个子类,如果我将它们全部放在父类的单元中,结果将非常大。

如何创建一个从不同单元的父类继承私有方法的子类?

谢谢!

4 个答案:

答案 0 :(得分:5)

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

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;

答案 1 :(得分:4)

这是类方法范围的遗留问题。从来没有从其他类中看到严格的PRIVATE方法,但是凭借他们的智慧,Borland在同一个单元中实现了这一点,可能与FORWARD声明的兼容性。随后,创建了许多利用此功能的代码。为了实现这一点,Delphi现在引入了STRICT PRIVATE,它可以在不破坏现有代码的情况下始终如一。 BRI

答案 2 :(得分:2)

你应该Protected而不是Private

喜欢这样

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

答案 3 :(得分:1)

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