1

私はのようなものが必要です

public class  object_t 
{

    public object_t ( string config, object_t default_obj )
    {
         if( /*failed to initialize from config*/ )
         { 
            this = default_obj; // need to copy default object into self
         }
    }
 }

私はこれが正しくないことを知っています。このコンストラクターを実装する方法は?

4

2 に答える 2

3

最も一般的なのは、おそらく静的ファクトリ メソッドを使用することです。

public class object_t 
{    
    public static object_t CreateObjectT(string config, object_t default_obj)
    {
         object_t theconfiguredobject = new object_t();

         //try to configure it

         if( /*failed to initialize from config*/ )
         { 
             return default_obj.Clone();
         }
         else
         {
             return theconfiguredobject;
         }
    }
}

上記を行うためのより良い方法は、コピー コンストラクターを作成することです。

public object_t (object_t obj)
    : this()
{
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    //...
}

そして、設定文字列からオブジェクトを作成しようとするメソッド:

private static bool TryCreateObjectT(string config, out object_t o)
{
    //try to configure the object o
    //if it succeeds, return true; else return false
}

次に、ファクトリ メソッドに TryCreateObjectT を最初に呼び出してもらい、それが失敗した場合は、コピー コンストラクターを次のように呼び出します。

public static object_t CreateObjectT(string config, object_t default_obj)
{
     object_t o;
     return TryCreateObjectT(config, out o) ? o : new object_t(default_obj);
}
于 2012-12-28T01:09:29.980 に答える
2

コンストラクター内で、各フィールドをデフォルト オブジェクトから新しいオブジェクトにコピーする必要があります。

public class  object_t 
{ 
    int A, B;

    public object_t ( string config, object_t default_obj )
    {
         if( /*failed to initialize from config*/ )
         { 
            this.A = default_obj.A; 
            this.B = default_obj.B; 
            //...
         }
    }
}

ただし、このクラスのフィールドが参照型である場合は、参照Cloneを割り当てるだけでなく、それらも必要になることに注意してください。

このアプローチではデフォルト オブジェクトのコピーが作成されますが、デフォルト オブジェクト自体を返すだけでよい場合は、lc で言及されているファクトリ アプローチを使用する必要があります。

于 2012-12-28T01:09:11.913 に答える