0

この前置きとして、これは決して大きな問題ではなく、プログラミング言語の設計に関してはあまり聞いたことがないことであり、興味深い解決策があるかどうか疑問に思っていました。

問題の核心はこれです。オブジェクト指向言語では、メソッドの1つを介してオブジェクトを変更できるようにしたいが、そのメソッドが返すものではなく、オブジェクト自体を返すことがあります。

Javaの例を挙げます。

class MyClass{
    public MyClass(List<Integer> list){
        //do constructor stuff
    }

    public MyClass(Integer i){
        //what I would like to be able to do
        this((new LinkedList<Integer>).add(i));
    }
}

this()は最初の行でなければならないため、2番目のコンストラクターで一時リストを作成できません。明らかに、実装を変更してこれを行う方法はたくさんあります。たとえば、オブジェクトを返すadd()メソッドを作成したり、オブジェクトを作成する関数がリストを作成したりするなどです。

ただし、多くの場合、サブクラス(LinkedListの場合)を変更または作成することはできません。また、呼び出し元のコードを混乱させたくない場合は、スタイル内のオブジェクトを変更して返すことができます。 ++xのは本当に便利かもしれません。this(#(new LinkedList).add(i)メソッドreturnではなく、反対したいことを示すようなもの です。これを可能にする言語を知っている人は、簡潔な構文上の方法です。そうでない場合、これはまったく役に立ちますか、それともここで基本的な何かが欠けていますか?

4

2 に答える 2

1

これはうまくいきませんか?

public class MyClass{
    public MyClass(List<Integer> list){
        //do constructor stuff
    }

    public static MyClass create(Integer i) {
        List<Integer> list = new new LinkedList<Integer>();
        list.add(i);
        MyClass myClass = new MyClass(list);
        return myClass;
    }
}

これは、ファクトリパターンと呼ばれるやや一般的なデザインパターンです。

于 2012-06-01T16:34:51.093 に答える
0

これを解決する最もクリーンな方法は、コンストラクターから呼び出される初期化メソッドを使用することだと思います。

class MyClass {public MyClass(List list){init(list); }

public MyClass(Integer i){
    LinkedList<Integer> list = new LinkedList<Integer>();
    list.add(i);
    init(list);
}

protected init(List<Integer> list)
{
    // do init stuff here
}

}

于 2012-06-06T16:10:59.087 に答える