3

これができるとは思いませんが、興味があります。スーパークラスで保護された変数をそのサブクラスでプライベートにすることは可能ですか?

たとえば、 と の 3 つのクラスSuperClassSubClass : SuperClassありSubCLass2 : SubClassます。

からの変数にアクセスできるようにしたいprotected string[] commandsが、SuperClassからのSubClassアクセスを防ぎたいSubClass2

これが不可能な場合、同じ効果を達成する方法はありますか?

4

4 に答える 4

7

これができるとは思いませんが、興味があります。スーパークラスで保護された変数をそのサブクラスでプライベートにすることは可能ですか?

いいえ。個人的には、最初から変数を非プライベートにすることは避けます。保護されたプロパティを提供します。基本プロパティを「隠す」ために新しいプロパティを作成することもできます...しかし、これは私には設計が不十分です。

他のクラスのいずれかを変更せずに、孫の観点から非表示を回避する方法は考えられませんが、私にはかなり恣意的に感じられます。

public class Base
{
    private int foo = 5;
    protected int Foo { get { return foo; } }
}

public class Child : Base
{
    protected new int Foo { get { return 0; } }
}

public class GrandChild : Child
{
    // Aargh, can't get at the original Foo...
}

なぜこれを達成したいのですか?おそらく、直接のサブクラスを封印し、代わりに他のクラスに構成を使用させる必要があります...

編集:コメントで説明されているように、これはプロパティを内部にする(そして私はまだプライベートフィールドを返すプロパティにする)ことが適切な状況であるように思えます。これにより、同じアセンブリ内の他のすべてのコードにプロパティへのアクセスが許可されますが、他のアセンブリにはアクセスできません。

于 2012-04-18T19:29:52.663 に答える
0

次のように、変数のコンテナを作成し、それをサブクラスとスーパークラスの間で共有することは可能だと思います。

class Prop {
    public string Str = "a string";
}
class A {
    Prop prop;
    protected A(Prop p) { prop = p; }
    public A() : this(new Prop()) { }
}
class B : A {
    Prop prop;
    private B(Prop p) : base(p) { prop = p; }
    public B() : this(new Prop()) { }
}
class C : B {
    public void Meth() {
        // has no access to prop.Str
    }
}
于 2012-04-18T20:00:44.583 に答える
0

私があなたに提供できる次善の策は (Skeet がすでに説明したことに従って)、物件を一歩でも見にくくすることです。これは素晴らしいことではありません。明示的なインターフェイスを使用する方法ではありませんが、知っておくべきことです。

 interface I
 {
   int Prop { get; set; }
 }

 class A : I
 {
   int I.Prop { get; set; }
 }

 class B : A
 {
   public void Bar()
   {
     (this as I).Prop = 2;
   }
 }

 class C : B
 {
   public void Foo()
   {
     //Prop = 1;
   }
 }
于 2012-04-18T19:57:54.653 に答える