2009-07-21 16 views
2

私は保護クラスの変数で "保護された"タブで宣言されたネストされたクラスを持つ親クラスを持っています。別のユニットで私は親クラスから継承する子クラスを持っています。親クラスからpublicになっていますが、ネストされたクラスから保護されたものにアクセスしようとすると、動作しません。ネストされたクラスを継承できますか?

type 
    TParent = class(TObject) 

    protected 
    class var x:integer; 
    type 
     TNested = class(TObject) 

     protected 
      class var y:integer; 
    end; 
end; 

子クラスで私のコード:

x := 10; //works 
y := 10; //undeclarated idenitifier 'y'. 
TNested.y := 10; //undeclarated idenitifier 'y' 

子クラスの宣言は次のとおりです。私は、Yにアクセスするにはどうすればよい

type 
    TChild = class(TParent); 

答えて

3

y:整数はTNestedクラスのprotectedフィールドです。 TNestedによってのみ使用でき、それ自体の継承クラスです。
おそらくTParentからTNestedを使用することができますが、これはDelphiでは同じユニットから呼び出す場合よりも大きなアクセス権を持つ可能性があります。したがって、TParentとTNestedは同じユニットにあるため、TNested保護データをTParentから呼び出すことができます。しかし、TChildはTNestedとは異なる単位であるため、不可能です。

+0

ない、ここで質問されているもの:

は、宣言クラスのサブクラスに継承できる分類入れ子になりました。 TNestedはネストされたクラス(D2006以降で利用可能)であり、同じユニット内の別のクラスではありません。これはTParentと呼ばれます.Nested –

+0

@Gerry、ここでの問題は、このクラスの外からいくつかのクラスのprotected要素を呼び出すことです。このクラスが存在するものはありません。外部からあるクラスの保護されたフィールドへのアクセスは、何らかの形でカプセル化に違反しています。 – smok1

0

これは、ユニット内のクラス間の暗黙の友情のために、TChildとTParentが同じユニットにある場合に動作します。

  1. 変更公共へのyの範囲を(あるいはそのためのパブリックプロパティを作成):

    はあなたの例ではYにアクセスするには、次の2つのもののいずれかを実行する必要があると思います。
  2. TNestedから派生したネストされたクラスのyを使用します。
0
TParent.x := 10; 
TParent.TNested.y := 10; 
0

たとえば、あなたがそれを継承していない、ネストされたクラスを使用して与えています。

TSubParent = class(TParent) 
protected 
    type 
    TSubNested = class(TNested) 
    public 
    class var Z : integer; 
    end; 
end; 
関連する問題