Delphi 为什么我的孩子班没有';是否从父类继承所有方法?

Delphi 为什么我的孩子班没有';是否从父类继承所有方法?,delphi,class,Delphi,Class,如果两个类都放在一个单元中-没有问题,子类从父类继承私有方法,但是如果它们位于不同的单元中,则该类只能访问公共方法。为什么 子类无法访问私有方法,因为它们位于不同的单元中 我如何避免这种情况?在我的例子中,我有3个子类,如果我把它们都放在父类的单元中,结果会非常大 如何使子类以不同的单位从父类继承私有方法 谢谢大家! 你应该制作它们,而不是 像这样 type TMyClass = class(TObject) Private procedure OnlyAccessedViaThisCl

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

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

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

如何使子类以不同的单位从父类继承私有方法

谢谢大家!

你应该制作它们,而不是

像这样

type 
TMyClass = class(TObject)
Private
   procedure OnlyAccessedViaThisClass;
Protected
   procedure OnlyAccessedViaThisClassOrSubClasses;
Public
   procedure AccessedByAnyone;
end;
你应该做,而不是

像这样

type 
TMyClass = class(TObject)
Private
   procedure OnlyAccessedViaThisClass;
Protected
   procedure OnlyAccessedViaThisClassOrSubClasses;
Public
   procedure AccessedByAnyone;
end;
私有方法是(单元)私有的。您需要的是一个受保护的方法。从基类继承的任何类都可以访问受保护的方法,即使它们位于不同的单元中。用户代码无法访问它们(除非他从类继承)

#

#

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

#

#


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

您的类无法访问这些方法,因为它们是祖先类的私有方法。您需要阅读有关公共、私有和受保护可见性的帮助文件。如果需要在子代中使用这些方法,请对类进行返工,以保护这些方法。

这是类方法范围的遗留问题。严格私有的方法永远不应该从其他类中可见,但是Borland以他们的智慧在同一个单元中实现了这一点,可能是为了与前向声明的兼容性。随后,创建了许多利用此功能的代码。为了实现这一点,Delphi现在引入了严格的PRIVATE,它可以在不破坏现有代码的情况下使事情始终保持原样。
Bri

这是类方法范围的遗留问题。严格私有的方法永远不应该从其他类中可见,但是Borland以他们的智慧在同一个单元中实现了这一点,可能是为了与前向声明的兼容性。随后,创建了许多利用此功能的代码。为了实现这一点,Delphi现在引入了严格的PRIVATE,它可以在不破坏现有代码的情况下使事情始终保持原样。
Bri

从Delphi 2006开始,还有一个严格的修饰符(如strict private)。使用这个修饰符,像C++一样的私有/保护工作(严格的私有-没有外部类可以访问该方法,严格保护-只有类和子类可以访问该方法)。托拜厄斯,它是Delphi 2005,不是2006年开始Delphi 2006,也有严格的修饰符(像严格的私有)。使用这个修饰符,像C++一样的私有/保护工作(严格的私有-没有外部类可以访问该方法,严格保护-只有类和子类可以访问该方法)。托拜厄斯,它是Delphi 2005,不是2006。
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;