2012-04-22 11 views
1

私はC#を学び、オーバーロードされたコンストラクタを理解しようとしています。なぜ、すべての必要なパラメータを持つコンストラクタが1つしかないのですか?以下では、私が作業している作業のための助けのコードをいくつか持っています。このコンストラクタを使ってこの点を理解するには、何か助けが必要です。いくつかの助けを正当化する!ありがとう!あなたのコンストラクタはフィールドだけを割り当てるよりも多くを行うことができ、アカウント内オーバーロードされたコンストラクタを理解する必要があります

public Email(string workMail) 
{ 
    m_work = workMail; 
    m_personal = string.Empty; 
} 

public Email(string workMail, string personalMail) 
{ 
    m_work = workMail; 
    m_personal = personalMail; 
} 

テイク:

public class Email 
{ 
    //private email 
    private string m_personal; 
    //work mail 
    private string m_work; 

    public Email() 
    { 
    } 

    public Email(string workMail) : this(workMail, string.Empty) 
    { 
    } 

    public Email(string workMail, string personalMail) 
    { 
     m_work = workMail; 
     m_personal = personalMail; 
    } 

    public string Personal 
    { 
     //private mail 
     get { return m_personal; } 

     set { m_personal = value; } 
    } 

    public string Work 
    { 
     get { return m_work; } 

     set { m_work = value; } 
    } 

    public string GetToStringItemsHeadings 
    { 
     get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); } 
    } 

    public override string ToString() 
    { 
     string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal); 
     return strOut; 
    } 


} 

答えて

3

なぜ、すべての必要なパラメータを持つコンストラクタが1つしかないのはなぜですか?

クラスのユーザーが一部のパラメータにのみ興味がある場合はどうなりますか?あなたの例を使って、誰かが個人的な電子メールを持っていない場合はどうなりますか?彼らはnullまたはstring.Emptyを渡すべきですか?このようなタイプレベルの知識は、タイプ自体によって最もよく処理されます。

作業用電子メールでのみ追加のコンストラクタを公開すると、基本的にクラスのコンシューマに「個人用メールはありませんか?心配しないで、処理します」というメッセージが表示されます

これに加えて、連鎖の定義は、自然にコードの冗長性を避けるのに役立ちます。

1

ポイントは、それはあなたがこれを防ぐことができますよう、繰り返しコードを避けるためです。

どのように動作しますか?試してデバッグして学ぶことができます。私は確信していませんが、私はそれが最初にあなたのコンストラクタのコードをオーバーロードされ、次に呼び出すと思います。あなたのシナリオでは、Email(string workMail)を呼び出すと最初のEmail(string workMail、string personalMail)が呼び出されます。

1

場合のクラスの方が簡単ここに個人のメールアドレスはありません。クラスのユーザーは、実際のアドレスを指定する必要があります。クラス自体は、そのフィールドの分かりやすいデフォルト値を設定することによって、存在しない個人アドレスの処理を処理します。そのパラメータが不足している場合、クラスのユーザは、個人メールアドレスが見つからない場合にstring.Emptyを埋めるためにresposibleになります。

コンストラクタは、コードの重複を避けるために、別のコンストラクタへの呼び出しとして実装されています。また、

public Email(string workMail) 
{ 
    m_work = workMail; 
    m_personal = string.Empty; 
} 

のように書くことができますが、それは「自分自身を繰り返してはいけない」の原則に従っているので2パラメータのコンストラクタを呼び出し、既存の実装はきれいなソリューションです。

2

これは約Constructorsではありません。すべての種類のオーバーロードされた関数は、ライブラリの使用を簡素化します。クラスをコーディングするときに、すべての複雑さをブラックボックスにカプセル化します。これは、既知のbest Practicesで可能です。良い例は.NETライブラリです(これらのオーバーロードされた関数/コンストラクタを覚えておいてください)。

これは間違いではありません。オーバーロードされた関数を使用して簡単に使用できるため、不要な場合にnullパラメータを渡す必要はありません。

第2に、より少ないパラメータで次の関数によってネストされたほとんどのパラメータを持つ関数を、Redundancyを減らす関数と呼びます。私は、すべてのバージョンの関数で同じコードをコピー/ペーストするのを避けることを意味します。

パターンが広く受け入れられ、使用されているため、次世代の.NETは何らかの形でこの冗長バージョンを隠し、ほとんどのパラメータで関数をコーディングします。

関連する問題