10

クラスのプロパティを public から見えるようにできますが、変更できるのは特定のクラスだけですか?

例えば、

// this is the property holder
public class Child
{
    public bool IsBeaten { get; set;}
}

// this is the modifier which can set the property of Child instance
public class Father
{
    public void BeatChild(Child c)
    {
        c.IsBeaten = true;  // should be no exception
    }
}

// this is the observer which can get the property but cannot set.
public class Cat
{
    // I want this method always return false.
    public bool TryBeatChild(Child c)
    {
        try
        {
            c.IsBeaten = true;
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

    // shoud be ok
    public void WatchChild(Child c)
    {
        if( c.IsBeaten )
        {
            this.Laugh();
        }
    }

    private void Laugh(){}
}

Childはデータ クラス、
Parentはデータを変更できるクラス、
Catはデータの読み取りのみが可能なクラスです。

C# で Property を使用してそのようなアクセス制御を実装する方法はありますか?

4

2 に答える 2

4

Child クラスの内部状態を公開する代わりに、代わりにメソッドを提供できます。

class Child {
  public bool IsBeaten { get; private set; }

  public void Beat(Father beater) {
    IsBeaten = true;
  }
}

class Father {
  public void BeatChild(Child child) {
    child.Beat(this);
  }
}

それでは、猫はあなたの子供を倒すことはできません。

class Cat {
  public void BeatChild(Child child) {
    child.Beat(this); // Does not compile!
  }
}

他の人が子供を打ち負かす必要がある場合は、実装できるインターフェイスを定義します。

interface IChildBeater { }

次に、実装してもらいます。

class Child {
  public bool IsBeaten { get; private set; }

  public void Beat(IChildBeater beater) {
    IsBeaten = true;
  }
}

class Mother : IChildBeater { ... }

class Father : IChildBeater { ... }

class BullyFromDownTheStreet : IChildBeater { ... }
于 2012-12-19T06:33:59.280 に答える
2

これは通常、個別のアセンブリとInternalsVisibleToAttributeを使用して実現されます。をマークするsetinternal、現在のアセンブリ内のクラスにアクセスできるようになります。その属性を使用することで、特定の他のアセンブリにその属性へのアクセスを与えることができます。Reflection を使用することで、常に編集可能になることを忘れないでください。

于 2012-12-19T05:17:50.213 に答える