1

他のメソッドで使用されているが、公開されているふりをしていない属性の滑らかさを持つクラスPotato(およびそのためのインスタンス)があるとします。この属性は、インスタンスの作成時に設定され、インスタンスの内部でのみ使用されます。

さらに、私のシステムはいくつかのデータベースドライバーをサポートする必要があるため、現在使用したいドライバーを使用するクラスでインスタンス化されるインターフェイス「データベースアダプター」があります。

ここで問題が発生します。オブジェクト(ポテト)を永続化してデータベースに保存する必要があるため、データベースアダプタクラスを使用してポテトの滑らかさを保存する必要がありますが、それはプライベートです!じゃがいもを他の目的で利用できるようにせずに、滑らかさを送るにはどうすればよいですか?

前もって感謝します

4

3 に答える 3

2

ある種のライターをパラメーターとして使用して、オブジェクトがそれ自体を保存できるようにするメソッドを記述します。これはデータベースであるため、Saveメソッドだけでなく、InsertメソッドとUpdateメソッドの両方が必要になる場合があります。これらをインターフェースに入れることもできます。

大まかな例:

public interface IDatabaseSaveable
{
   void InsertToDatabase(Database pDatabase);
   void UpdateDatabase(Database pDatabase);
}

public class Potato : IDatabaseSaveable
{
   private int mID;
   private double mSmoothness;

   public void InsertToDatabase(Database pDatabase)
   {
      pDatabase.InsertToPotatoes(mID, mSmoothness, ...);
   }

   public void UpdateDatabase(Database pDatabase)
   {
      pDatabase.UpdatePotatoes(mID, mSmoothness, ...);
   }
}
于 2012-04-09T22:15:42.003 に答える
2

Potato実装の詳細(この場合は、プライベートメンバーとデータ型)へのアクセスを許可せずに、の「状態」を外部化するインポーター/エクスポーターインターフェイスペアを作成できます。彼らはビルダーのタイプです。

public class Potato {
  public interface IExporter {
    void AddSmoothness(string value);
  }
  public interface IImporter {
    string ProvideSmoothness();
  }

  public Potato(IImporter importer) {
    this.smoothness = int.Parse(importer.ProvideSmoothness());
  }

  public void Export(IExporter exporter) {
    exporter.AddSmoothness(this.smoothness.ToString());
  }

  public Potato(int smoothness) {
    this.smoothness = smoothness;
  }

  private int smoothness;
}

次に、データベースアダプタクラスは関連するインターフェイスを実装し、対応するメソッドを使用します。元のアイデアはこちらをご覧ください。

于 2012-04-10T03:09:18.980 に答える
1

これは、としてマークされた滑らかさプロパティを持つバリエーションinternalです。ポテトを使用する前にセットが必要であると仮定するとsmoothness、内部コンストラクターの方が適している可能性があります。滑らかさを隠すのには十分な理由があると信じて受け入れます。じゃがいもの謙虚さ、たぶん?

public class Potato
{
    internal int Smoothness { get; set; }

    internal Potato(int smoothness)
    {
        this.Smoothness = smoothness;
    }
    private Potato() { }
}

Potato同じアセンブリ内のクラスのみが、内部コンストラクターを使用してインスタンス化できます。また、同じアセンブリ内のクラスのみがSmoothnessにアクセスできます(ジャガイモを節約できます)。

于 2012-04-09T21:58:03.513 に答える