2009-07-16 5 views
1

두 클래스가 하나의 단위로 배치되는 경우 문제가 없습니다. 하위 클래스는 상위 클래스의 개인 메서드를 상속하지만 다른 단위 인 경우 공용 메서드에만 액세스 할 수 있습니다. 왜?내 자식 클래스가 부모 클래스의 모든 메서드를 상속하지 않는 이유는 무엇입니까?

하위 클래스는 다른 단위에 있기 때문에 전용 메서드에만 액세스 할 수 없습니다.

어떻게해야합니까? 내 경우에는 3 개의 하위 클래스가 있으며 상위 클래스 단위로 모두 배치하면 결과가 매우 커집니다.

어떻게 부모 클래스의 개인 메서드를 다른 단위로 상속 한 자식 클래스를 만들 수 있습니까?

감사합니다.

답변

5

개인 방법 (단위) 개인처럼 대신 Private

의, 그들 Protected해야한다. 필요한 것은 보호 된 방법입니다. 보호 된 메서드는 기본 클래스에서 상속하는 모든 클래스에서 액세스 할 수 있습니다. 사용자 코드는 클래스에 상속되지 않으면 액세스 할 수 없습니다.

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

델파이 2006에는 엄격한 수정 자도 있습니다 (엄격한 전용). 이 수정자를 사용하면 C++와 같은 개인/보호 된 작업 (엄격한 개인 - 클래스 외부의 아무도 메소드에 액세스 할 수 없으며 엄격하게 보호 됨 - 클래스와 서브 클래스 만 메소드에 액세스 할 수 있음). –

+0

Tobias, 2006 년이 아니라 Delphi 2005입니다. –

2

당신은 너무

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

가 상위 클래스에 개인 있기 때문에 귀하의 클래스는 이러한 메서드에 액세스 할 수 없습니다. 공개, 개인 및 보호 된 가시성에 대한 도움말 파일을 읽어야합니다. 자손 클래스를 재 작성하여 자손에서 사용해야하는 경우 해당 메소드가 보호되도록하십시오.

4

이 문제는 클래스 메서드의 범위와 관련된 기존 문제입니다. 엄밀히 말하면 개인 클래스는 다른 클래스에서 볼 수 없었어야했는데, 볼랜드에서는 같은 유닛 내에서 가능하게 만들었습니다. FORWARD 선언과의 호환성을 위해서였습니다. 그 결과이 기능을 활용하는 많은 코드가 만들어졌습니다. 이것을 시행하기 위해 Delphi는 STRICT PRIVATE를 도입했습니다. STRICT PRIVATE는 기존 코드를 손상시키지 않고 언제나 있어야했던 방법을 제공합니다. Bri

관련 문제