2012-02-24 19 views
2

たとえば、複素数を表現するためにComplexクラスを定義しているとします。 Iは、例えば書くことができるように、私は、2つのコンストラクタを定義したい:C#:同じ署名メソッド/コンストラクタと名前付き引数

Complex z1 = new Complex(x: 4, y: 3); 
Complex z2 = new Complex(r: 2, theta: Math.PI/4); 

しかし、私はこのようなコンストラクタを定義することはできません:両方のコンストラクタは、同じシグネチャを有することになるので

public Complex(double x, double y) { ... } 
public Complex(double r, double theta) { ... } 

を、その許可されていません。しかし、C#4で、私はオプションの引数を使用して、これを書くことができます。

public Complex(double x, double y) { ... } 
public Complex(double r, double theta, bool unused=true) { ... } 

をそれは動作しますが、私はその後、意図したとおり上記のコンストラクタの呼び出しを使用することができます。 unused引数の唯一の目的は、シグネチャを異なるものにすることです。定義時とコンストラクタ呼び出し時の両方で、まったく使用されていません。

私にとってこれは醜いトリックだと思われます。それ以上の選択肢はありますか?

+1

これは本当にあなたに何も買わない - あなたは2つの二重の引数(それは常に同じものになります)で呼び出されるかどうかは制御できません。 –

+0

あなたが正しいですが、私の目的は、名前付き引数のおかげで使用したいコンストラクタを明示的に選択することです。 – ChrisJ

答えて

7

コンストラクタをプライベートにし、静的なファクトリスタイル関数を使用します。

public static Complex CreateComplexPolar(double r, double theta); 
public static Complex CreateComplex(double x, double y); 

入力内容は、入力内容に基づいて検証することができます。

もう1つの可能性は、前述のように入力をカプセル化し、コンストラクタを使用する型を作成することです。

public struct PolarCoordinates 
{ 
    public double Rho; 
    public double Theta; 
} 

public struct CartesianCoordinates 
{ 
    public double X; 
    public double Y; 
} 

public Complex(PolarCoordinates pc); 
public Complex(CartesianCoordinates cc); 
3

クラスを作成するための静的メソッドを作成し、Complex::FromDoubleComplex::FromDoubleAndThetaを言います。

さらに進んで、実際のコンストラクタを非公開にして、強制的に構築することができます。

たとえば、TimeSpanのFromDaysおよびFromHoursを参照してください。

p.s. 使用より良い名前:)

HTH

0

私は考えることができる唯一のことは、1つのコンストラクタ(ダブル、ダブル)を作ることになり、もう一方は、ダブルのFuncである可能性があります。

public Complex(double x, double y) { ... } 
public Complex(double r, Func<double> theta) { ... } 

それはあなたが計算をやっているし、その計算の結果は、そのコンストラクタの第二値であることは、上記から、あなたの例のように見えます。それが常に当てはまる場合、代わりにFuncパラメータにすることができます。ハックの種類ですが、何もしないオプションの3番目のパラメータを持つよりも良いかもしれません。

+0

実際には、「シータ」は単なる角度です。 π/ 4は実際には*計算*ではなく、角度値を指定する便利な方法です。私も同様に「0.79」のようなものを書くことができました。したがって、2番目の引数は実際には2倍にする必要があります。 – ChrisJ

+0

私はあなたのポイントを見ます。このようにしてコンストラクタを区別することはできますが、しかし、まだハック。パラメータのないコンストラクタについて考えて、さまざまなパラメータの組み合わせに対してプロパティを使用しましたか?どちらかというと、基本クラスを作って、各コンストラクターをベースから継承する別のクラスにすることができると思います。 –

+0

無意味なコンストラクタのプロパティ:私が心配しているのは、「初期化されていない」オブジェクトを作成できることです。サブクラス化:クラスは、コンストラクタ*の種類ではなく、*オブジェクトの種類を表現する必要があります。* ...再び、ハックです。 – ChrisJ

関連する問題