如果两个类都放在一个单元中 - 没有问题,子类继承父类的私有方法,但如果它们位于不同单元中,则该类只能访问公共方法。为什么?为什么我的子类不会继承父类的所有方法?
子类不能只访问私有方法,因为它们在不同的单元中。
我该如何避免这种情况?在我的情况下,我有3个孩子班,如果我把他们全部放在父班的单位,结果将是非常大的。
如何制作一个继承了父类中不同单元的私有方法的子类?
谢谢!
如果两个类都放在一个单元中 - 没有问题,子类继承父类的私有方法,但如果它们位于不同单元中,则该类只能访问公共方法。为什么?为什么我的子类不会继承父类的所有方法?
子类不能只访问私有方法,因为它们在不同的单元中。
我该如何避免这种情况?在我的情况下,我有3个孩子班,如果我把他们全部放在父班的单位,结果将是非常大的。
如何制作一个继承了父类中不同单元的私有方法的子类?
谢谢!
的私有方法是(单位)私人。你需要的是一种受保护的方法。受保护的方法可以由任何继承自基类的类访问,即使它们位于不同的单元中。用户代码不能访问它们(除非他从类继承)。
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;
你的类不能访问这些方法,因为它们是私有的祖先类。您需要阅读关于公共,私人和受保护可见性的帮助文件。重做你的课程,以便这些方法受到保护,如果你需要在后代中使用它们。
这是类方法范围的遗留问题。严格来说,私有方法永远不可能从其他类中看到,但Borland以他们的智慧在同一个单元内实现了这一点,可能是为了与FORWARD声明兼容。随后,创建了大量利用此功能的代码。为了执行此操作,Delphi现在已经引入了STRICT PRIVATE,它可以让事情始终如一,而不会破坏现有的代码。 Bri
从Delphi 2006开始,还有一个严格的修改器(比如严格的私有)。使用这个修饰符,私有/受保护的工作就像C++一样(严格私有 - 外部没有人可以访问方法,严格保护 - 只有类和子类可以访问方法)。 – 2009-07-16 11:00:56