インスタンス全体に値を割り当てるコンストラクタを持つことは可能ですか?

私にこのようなクラスがある場合:

class myClass
{
    string foo;
    string bar;

    public myClass(string foo, string bar)
    {
        //does some stuff here
        (myClass)deserializer.Deserialize(reader); //assign the return value to the instance
    }

}

これを達成する何か:

public myClass(string foo, string bar)
    {
        //does some stuff here
        myClass tempobject = (myClass)deserializer.Deserialize(reader); //this method has a return value of type myClass
        this.foo = tempObject.foo;
        this.bar = tempObject.bar;
    }

SomeMethod returns a value of type myClass. Can I assign this returned value to the instance of myClass that invoked the constructor?

0
いいえ。インスタンスは「自分自身を置き換える」ことはできません。あなたができることは、他のインスタンスからすべての状態をコピーすることです。それが十分であれば、決定する必要があります。
追加された 著者 Thilo,

4 答え

いいえ、それは不可能です。

あなたは、 SomeMethod を静的にし、コンストラクタをprivateにすることができます。これは、ファクトリパターンと呼ばれます。あなたのクラスのインスタンス。ファクトリパターンは、実行時にさまざまな異なる具象クラスのインスタンスを作成するためによく使用されます。


メソッドがあなたのクラスにないと言う質問を更新したので、クラスの別のインスタンスを取得し、そのメソッドですべてのプロパティをコピーするメソッドをクラス内に作成することをお勧めします。あなたはあなたのコンストラクタでそれを呼び出すでしょう。

3
追加された
SomeMethod が何であるかを指定するために質問を修正しました。
追加された 著者 xbonez,

いいえ - コンストラクタは、コンストラクタが呼び出される前にオブジェクトをインスタンス化する必要があるため、作成したクラスにインスタンスを返しません。コンストラクタはちょっと前に作成されたクラスの初期化作業を行います。

代わりに、次のような "ファクトリ"パターンを使用する必要があります。

public class SomeClass {
    public static SomeClass CreateNew(string foo, string bar) {
        if (SOME_CONDITION) {
           //use our SomeMethod
            return SomeMethod(foo,bar);
        } else {
           //otherwise use the normal constructor
            return new SomeClass(x,y);
        }
    }
}

// ... elsewhere...

    SomeClass foo = Someclass.CreateNew("x","y");
2
追加された

次のように、あなたのリーダーからオブジェクトを作成するための静的メソッドを書くことができます:

class myClass  
{      
    public string foo { get; set; }
    public string bar { get; set; }        


    public myClass()      
    {          
        //does some stuff here     
    }

    public static myClass FromReader(Reader reader)
    {
        return (myClass)deserializer.Deserialize(reader); 
    }
}

あなたのコードで以下のように使用してください:

myClass newMyClass = myClass.FromReader(reader);
0
追加された
class myClass
{
    string foo;
    string bar;

    public myClass(string foo, string bar)
    {
        //does some stuff here
        mYclass result = SomeMethod(foo,bar); //this method has a return value of type myClass
        this.foo = result.foo;
        this.bar = result.bar;
    }
}
0
追加された