2017-03-14 2 views
1

が、私は2つのクラスを持ち、AとBのBはここA.完全な入れ子になった部分クラス

から継承私の問題です:私は、クラスAのため、だけでなく、便利です定数コンスタンツァを持っています子クラス。

パブリック静的ネストされたクラスに私の定数を格納するので、子クラスのConstantsクラスは親を隠してしまいます。私はそれを部分クラスにしようとしましたが、それは助けになりません。これを解決する方法はありますか?ここで

は例です:

public class A 
{ 
    public static partial class Constants 
    { 
     public const int ConstantA = 1; 
    } 
} 

public class B : A 
{ 
    public static partial class Constants 
    { 
     public const int ConstantB = 1; 
    } 
} 

ありがとうございました!

+1

'ConstantA'がすべての子クラスにとって有益なのはなぜ、内部の静的クラスではなく親の内部でそれを動かさないのでしょうか? –

答えて

1

あなたにもA部分クラスを作成し、Bクラス自体は別に、あなたのB-特定の定数を宣言する必要があります:デザインは、すべての良いことであると言わ

public partial class A 
{ 
    public static partial class Constants 
    { 
     public const int ConstantA = 1; 
    } 
} 

public partial class A 
{ 
    public static partial class Constants 
    { 
     public const int ConstantB = 1; 
    } 
} 

public class B : A 
{ 
    static void M() 
    { 
     int i = Constants.ConstantB; 
     int j = Constants.ConstantA; 
    } 
} 

が、私は懐疑的です。 ConstantBの値がAの中にあることを宣言する効果があります。これは、ConstantBが実際にクラスBにのみ関連していると仮定すると、カプセル化の目標に反しているようです。このように宣言した場合、ConstantBは、のいずれかの種類のConstantsクラスを使用してアクセスできます。

しかし、これで大丈夫なら、定数の宣言Bクラスのままであることを確認しようとしている場合は、上記が有効になります。

その他のオプションはベースを隠し、ベース値(例えばA.Constants.ConstantA)にアクセスするために完全修飾として基本クラスを指定することのマイナー不便で、(newキーワードを使用して)ベースConstantsクラスを先に行くと隠し含まB.Constantsクラスを持つ場合はA.Constantsstaticクラス属性を破棄する必要があります)またはIMHOを継承し、ネストされたクラスをまったく使用せず、代わりにConstantsクラスをそれぞれの名前空間に配置します。

1

ConstantAを親クラスの属性にするだけで、この属性をネストされたクラスに置くと、継承されたクラスのスコープからその属性が削除されます。

0

あなたが本当に入れ子になったクラスをしたい場合は、staticキーワードを残し、そしてB.Constantsネストされたクラスの継承を行うことができます。

public class A 
{ 
    public class Constants 
    { 
     public const int ConstantA = 1; 
    } 
} 

public class B : A 
{ 
    public new class Constants : A.Constants 
    { 
     public const int ConstantB = 2; 
    } 
} 

使用量は同じになります。

関連する問題