0

以下のコードは2つのクラスで構成されています。

  • SmartForm(単純なモデルクラス)
  • SmartForms ( SmartFormオブジェクトのコレクションを含む複数形)

このように単数形と複数形の両方のクラスをインスタンス化できるようにしたい(つまり、ファクトリメソッドGetSmartForm()は必要ない):

SmartForms smartForms = new SmartForms("all");
SmartForm smartForm = new SmartForm("id = 34");

ロジックを統合するには、複数形のクラスのみがデータベースにアクセスする必要があります。単数形のクラスは、それ自体をインスタンス化するように求められると、単に複数形のクラスをインスタンス化し、複数形のオブジェクトのコレクションから1つのオブジェクトを選択して、そのオブジェクトになります

それ、どうやったら出来るの?this動作しないオブジェクトを割り当ててみました。

using System.Collections.Generic;

namespace TestFactory234
{
    public class Program
    {
        static void Main(string[] args)
        {
            SmartForms smartForms = new SmartForms("all");
            SmartForm smartForm = new SmartForm("id = 34");
        }
    }

    public class SmartForm
    {
        private string _loadCode;

        public string IdCode { get; set; }
        public string Title { get; set; }

        public SmartForm() {}

        public SmartForm(string loadCode)
        {
            _loadCode = loadCode;
            SmartForms smartForms = new SmartForms(_loadCode);
            //this = smartForms.Collection[0]; //PSEUDO-CODE
        }

    }

    public class SmartForms
    {
        private string _loadCode;

        public List<SmartForm> _collection = new List<SmartForm>();
        public List<SmartForm> Collection
        {
            get
            {
                return _collection;
            }
        }

        public SmartForms(string loadCode)
        {
            _loadCode = loadCode;
            Load();
        }

        //fills internal collection from data source, based on "load code"
        private void Load()
        {
            switch (_loadCode)
            {
                case "all":
                    SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
                    SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
                    _collection.Add(smartFormA);
                    _collection.Add(smartFormB);
                    _collection.Add(smartFormC);
                    break;
                case "id = 34":
                    SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                    _collection.Add(smartForm2);
                    break;
                default:
                    break;
            }
        }
    }
}
4

5 に答える 5

7

あるオブジェクトを別のオブジェクトに「なる」ようにすることはできません。

コンストラクターの代わりに静的メソッドを使用します(そして、静的メソッドのみがそれらにアクセスできるように、コンストラクターをプライベート/内部/何でもします)。コンストラクターよりも静的メソッドを使用することには、多くの利点があります。

  • 必要に応じてnullを返すことができます
  • 必要に応じて、既存のオブジェクトを返すことができます
  • たくさんの作業を行ってから、フィールドを設定するだけの単純なコンストラクターを呼び出すことができます

欠点は、C#コレクション/オブジェクト初期化子では機能しないことです:(

静的メソッド(依存性注入ではうまく機能しないことは確かです)の代わりに、別のファクトリを作成し、その上でインスタンスメソッドを呼び出すこともできます。

于 2009-06-09T15:15:49.033 に答える
4

まったく同じオブジェクトである必要はありません。外部の観察者には同じように見える必要があります。あるオブジェクトから別のオブジェクトにすべてのデータをコピーすると、同じことが達成されます。

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}
于 2009-06-09T15:18:34.630 に答える
3

それはいけません。Microsoftは、代わりにpublic static Create()メソッドを定義することでこれを行います。たとえば、System.Net名前空間のWebRequestとHttpWebRequestを参照してください。同じことをすることをお勧めします。

基本クラスのコンストラクターを内部またはプライベートにして、直接インスタンス化できないようにします。またはさらに良いことに、それを抽象クラスにします。Create()実装で非表示のコンストラクターを利用します。

于 2009-06-09T15:16:49.313 に答える
2

internalコンストラクターには、の代わりにorprotected修飾子を使用できますpublic。そのような:

public SmartForm() {}
public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}

になります:

internal SmartForm() {}
internal SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    //this = smartForms.Collection[0]; //PSEUDO-CODE
}
于 2009-06-09T15:14:08.507 に答える
0

という名前のプライベート クラスを作成し、SmartFormDataすべての値をそこに入れることができます。

SmartForms複数形のクラスがそれらのオブジェクトのコレクションを維持するようにし、単数形のコンストラクタが正しいSmartFormSmartFormData インスタンスをSmartForms複数形で見つけられるようにします。

次に、単数形のすべてのプロパティにSmartForm値を取得させますSmartFormData

ただし、これを行う最善の方法は、プライベート コンストラクターを持ち、ファクトリ メソッドを使用することです。

コンストラクタを使用しなければならない理由はありますか?

于 2009-06-09T17:46:10.667 に答える