48
int a, b, c;

Constructor()
{
    a = 5;
    b = 10;
    c = 15;
    //do stuff
}
Constructor(int x, int y)
{
    a = x;
    b = y;
    c = 15;
    //do stuff
}
Constructor(int x, int y, int z)
{
    a = x;
    b = y;
    c = z;
    //do stuff
}

「もの」といくつかの割り当ての重複を防ぐために、次のようなものを試しました:

int a, b, c;

Constructor(): this(5, 10, 15)
{
}
Constructor(int x, int y): this(x, y, 15)
{
}
Constructor(int x, int y, int z)
{
    a = x;
    b = y;
    c = z;
    //do stuff
}

これは私がやりたいことにはうまくいきますが、新しいオブジェクトを作成したり、計算を実行したりするために、長いコードを使用する必要がある場合があります。

int a, b, c;

Constructor(): this(new Something(new AnotherThing(param1, param2, param3),
    10, 15).CollectionOfStuff.Count, new SomethingElse("some string", "another
    string").GetValue(), (int)Math.Floor(533 / 39.384))
{
}
Constructor(int x, int y): this(x, y, (int)Math.Floor(533 / 39.384))
{
}
Constructor(int x, int y, int z)
{
    a = x;
    b = y;
    c = z;
    //do stuff
}

このコードは以前とほとんど同じですが、渡されるパラメーターだけがあまり読みにくくなっています。私は次のようなことをしたいと思います:

int a, b, c;

Constructor(): this(x, y, z) //compile error, variables do not exist in context
{
    AnotherThing at = new AnotherThing(param1, param2, param3);
    Something st = new Something(aThing, 10, 15)
    SomethingElse ste = new SomethingElse("some string", "another string");

    int x = thing.CollectionOfStuff.Count;
    int y = ste.GetValue();
    int z = (int)Math.Floor(533 / 39.384);

    //In Java, I think you can call this(x, y, z) at this point.
    this(x, y, z); //compile error, method name expected
}
Constructor(int x, int y): this(x, y, z) //compile error
{
    int z = (int)Math.Floor(533 / 39.384);
}
Constructor(int x, int y, int z)
{
    a = x;
    b = y;
    c = z;
    //do stuff
}

基本的に、コンストラクタ本体内にパラメータを構築しています。次に、これらの構築されたパラメーターを別のコンストラクターに渡そうとしています。Javaでコーディングするときに、「this」および「super」キーワードを使用して、別のコンストラクターの本体内でコンストラクターを呼び出すことができたことを覚えていると思います。C# ではできないようです。

これを簡単に行う方法はありますか?私は何か間違ったことをしましたか?これが不可能な場合は、判読できないコードに固執する必要がありますか?

複製されたコードを、コンストラクターの完全に外側の別のメソッドにいつでもカットできると思います。次に、各コンストラクターは独自のことを行い、他のコンストラクターが共有するコードを呼び出します。

4

2 に答える 2

45
于 2012-04-30T03:04:25.527 に答える
26

できるよ

Constructor() : this(5, 10, 15)
{
}
Constructor(int x, int y) : this(x, y, 15)
{
}
Constructor(int x, int y, int z)
{
  int a = x;
  int b = y;
  int c = z;
  //do stuff
}

ただし、パラメーターに応じて派手なロジックを実行する必要がある場合は、ファクトリ パターンを使用します。

public class myclass
{
  private myclass(int x, int y, int z)
  {
    int a = x;
    int b = y;
    int c = z;
    //do stuff
  }
  public static myclass Create()
  {
    AnotherThing at = new AnotherThing(param1, param2, param3);
    Something st = new Something(aThing, 10, 15)
    SomethingElse ste = new SomethingElse("some string", "another string");

    int x = thing.CollectionOfStuff.Count;
    int y = ste.GetValue();
    int z = (int)Math.Floor(533 / 39.384);

    return new myclass(x, y ,z);
  }
  public static myclass Create(int x, int y)
  {
    if (x = 1)
      return new myclass(x, y, 2)
    else 
      return new myclass(x, y, 15);
  }
  public static myclass Create(int x, int y, int z)
  {
    //so on and so forth
    return new myclass(x, y, z);
  }
}

ファクトリ パターンは必要ありませんが、コンストラクタ ロジックが確実に読みやすくなります。

于 2012-04-30T02:38:20.177 に答える