2009-07-16 72 views
1

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

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

我该如何避免这种情况?在我的情况下,我有3个孩子班,如果我把他们全部放在父班的单位,结果将是非常大的。

如何制作一个继承了父类中不同单元的私有方法的子类?

谢谢!

回答

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; 
+0

从Delphi 2006开始,还有一个严格的修改器(比如严格的私有)。使用这个修饰符,私有/受保护的工作就像C++一样(严格私有 - 外部没有人可以访问方法,严格保护 - 只有类和子类可以访问方法)。 – 2009-07-16 11:00:56

2

你应该让他们Protected,而不是Private

像这样

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

你的类不能访问这些方法,因为它们是私有的祖先类。您需要阅读关于公共,私人和受保护可见性的帮助文件。重做你的课程,以便这些方法受到保护,如果你需要在后代中使用它们。

4

这是类方法范围的遗留问题。严格来说,私有方法永远不可能从其他类中看到,但Borland以他们的智慧在同一个单元内实现了这一点,可能是为了与FORWARD声明兼容。随后,创建了大量利用此功能的代码。为了执行此操作,Delphi现在已经引入了STRICT PRIVATE,它可以让事情始终如一,而不会破坏现有的代码。 Bri

相关问题