1

私はC#を使用していますが、これについてはあまり経験がありません(これまで、ほとんどjava / php / javascriptを使用してきました)

私が欲しいのは、いくつかのデータを保存するクラスです。このデータは、他の1つのクラスによってのみ書き込むことができますが、プログラム内の他のクラスによって読み取ることはできます。

このようなもの:

public class DataObtainer{
 DataItem[] Items;
 public DataObtainer(){
  Items = new DataItem[20];
 }
 public void Update(){
  Items[0].SomeProperty = 5;//Being able to change SomeProperty
 }
 //Class only contains properties
 public class DataItem{
  public int SomeProperty;
 }
}

public class AnyOtherClass{
 public void SomeMethod(){
  DataObtainer do = new DataObtainer();
  //What I want:
  DataItem di  = do.items[0];
  Console.WriteLine(di.SomeProperty);//Being able to read SomeProperty
  di.SomeProperty = 5;//Not allow this, not being able to change SomeProperty
 }
}
4

3 に答える 3

3

インターフェイスを使用します。

public interface IData
{
   string Data1 { get;}
   int MoreData { get;}
}

class Data : IData
{
   public string Data1 { get; set;}
   public int MoreData {get; set;}
}

public class DataObtainer
{
   private Data[] items;
   public DataObtainer()
   {
      items = new Data[20];
   }
   public IEnumerable<IData> Items
   {
      get
      {
         return items;
      }
   }

   public void Update()
   {
      Items[0].MoreData = 5;//Being able to change MoreData
   }
}

public class AnyOtherClass
{
   public void SomeMethod()
   {
       DataObtainer do = new DataObtainer();
       //What I want:
       IData di  = do.Items.First();
       Console.WriteLine(di.MoreData);//Being able to read SomeProperty
       di.SomeProperty = 5;//this won't compile
   }
}

説明:

  1. コードに提供するインターフェイスを作成します(IData)
  2. そのインターフェースの実装で作成する
  3. 実装を取得者に保存します
  4. 他のコードにインターフェースへのアクセスのみを許可します。これは、値を変更するためのアクセス権を彼らに与えません。
  5. 呼び出し元のコードは、必要に応じて実装にキャストできますが、契約に違反し、すべての賭けが無効になります。
于 2010-08-29T03:44:32.740 に答える
0

DataItem外側の(ネストされていない)クラスをabstract作成してから、それを継承してパブリックミューテーターメソッドを提供する内側の(プライベート)クラスを作成する必要があります。

ではDataObtainer、オブジェクトをプライベート継承クラスにキャストして変更できます。

于 2010-08-29T03:26:47.927 に答える
0

そのようなデザインは私には厄介に思えます。あなたはコードを管理しているので、ある種のフレームワーク/ APIを設計していない限り、あなたが求めていることは実際には必要ありません。クラスがプロパティを変更できない場合は、プロパティを変更したり、セッターを提供したりしないでください。

ここであなたの目標を達成するための最善のアプローチを私たちが理解するのを助けるために、これを達成する必要がある理由や理由についてもう少し説明できればと思います。

基本的な継承を使用した簡単な例

// Class used to read and write your data
public class DataBuilder : Data {
    public void SetValue(int value) {
        base.m_SomeValue = value; // Has access to protected member
    }
}

// Class used to store your data (READONLY)
public class Data {
    protected int m_SomeValue; // Is accessible to deriving class
    public int SomeValue {     // READONLY property to other classes
                               // EXCEPT deriving classes
        get {
            return m_SomeValue;
        }
    }
}

public class AnyOtherClass {
    public void Foo() {
        DataBuilder reader = new DataBuilder();
        Console.WriteLine(reader.SomeValue); // *CAN* read the value
        reader.SomeValue = 100; // CANNOT *write* the value
    }
}
于 2010-08-29T03:47:53.310 に答える