【发布时间】:2009-07-16 09:58:25
【问题描述】:
如果两个类都放在一个单元中-没问题,子类继承父类的私有方法,但是如果它们在不同单元中,则该类只能访问公共方法。为什么?
子类不能访问私有方法只是因为它们在不同的单元中。
如何避免这种情况?就我而言,我有 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;
【讨论】:
这是类方法范围的遗留问题。严格来说,PRIVATE 方法永远不应该在其他类中可见,但在他们的智慧中,Borland 在同一个单元中使这成为可能,可能是为了与 FORWARD 声明兼容。随后,创建了许多利用此功能的代码。为了强制执行这一点,Delphi 现在引入了 STRICT PRIVATE,它可以在不破坏现有代码的情况下将事情带到他们应该一直的状态。 布里
【讨论】:
您的类无法访问这些方法,因为它们是祖先类的私有方法。您需要阅读有关公共、私人和受保护可见性的帮助文件。如果您需要在后代中使用这些方法,请重新编写您的类,以便保护这些方法。
【讨论】: