2016-09-12 7 views
0

私は複数のクラスによって継承されているC#の抽象クラスで作業しています。私がコード内で必要としていることの1つは、「Unset」などの静的プロパティです。このプロパティは、クラスの静的インスタンスであり、そのメインプロパティは設定されていない値に定義されています。一般的な例を次に示します。抽象クラスの静的インスタンスを定義するにはどうすればよいですか?

public abstract class Person 
{ 
     public string Name {get; set;} 
     public string PhoneNumber {get; set;} 
     public static readonly Person Unset = new Person() { 
      Name = "Unset Name" 
      PhoneNumber = "Unset Phone" 
     } 
} 

Personは抽象クラスであるため、私は "Unset"プロパティを構築できません。私は "Person"から派生するすべてのクラスのプロパティを定義したくありません。これを回避する方法はありますか?

答えて

2

抽象クラスのインスタンスを作成することはできません。あなたは何ができるか

は、しかし、新しい子を作成することです。その後、

public class UnsetPerson : Person 
{ 
    public UnsetPerson() : base() 
    { 
     this.Name = "Unset Name"; 
     this.PhoneNumber = "Unset Phone"; 
    } 
} 

そして、あなたのベースクラスにstaticプロパティを設定します。

public abstract class Person 
{ 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
    public static readonly Person Unset = new UnsetPerson(); 
} 
+0

シングルトンインスタンスにパブリックセッターを置くことは、本当に悪い考えであることに注意することも重要です。 – Groo

+0

これで私のプロジェクトのニーズに十分なのかどうか分かりませんが、私が尋ねた質問に対する解決策は間違いありません。ありがとう! – celsound

0

documentationabstractキーワードが示していることを示します変更されているものには、実装が不足しているか不完全であることがあります。その結果、直接作成することはできず、継承を介してのみ使用することができます。

あなたの抽象クラスが抽象クラスに含まれていないので、代わりにクラスを使用すると、オプションで上書きできるデフォルトの実装を提供できます。あなたは/継承クラスでクラスメンバーのいずれかを上書きする必要がない場合は

public virtual class Person 
{ 
    public virtual string Name { get; set; } 
    public virtual string PhoneNumber { get; set; } 
    public static readonly Person Unset = new Person() { 
     Name = "Unset Name", 
     PhoneNumber = "Unset Phone" 
    }; 
} 

、あなたは抽象または仮想クラスを作成する必要はありません。任意の(sealed)クラスは継承できます。

+0

これは例でした - 私の実際のクラスは抽象である必要があります。しかし、チップのおかげで。 – celsound

0

私はあなたの要件を完全に理解していません。新しく作成した派生クラスのインスタンスに「未設定」の値が含まれていることを確認しますか?これは抽象クラスで、コンストラクタで行うことができます。

protected Person() 
{ 
    Name = "Unset Name"; 
    PhoneNumber = "Unset Phone"; 
} 

はい、抽象クラスは、あなたがそれを直接インスタンス化できない場合でも、コンストラクタを持つことができます。基本クラスのコンストラクタは、派生クラスのコンストラクタの前に呼び出されるため、派生クラスのコンストラクタ内に適切なパラメータがある場合は常にその値を上書きできます。

+0

いいえ、静的に参照できる値が必要でした。私はこのクラスのインスタンスを期待するメソッドがたくさんあり、未定義/ nullの場合には多くのロジックを処理する必要があります。 私が持っていたすべてのnullケースを処理するよりも簡単に作業できるようにデフォルトまたは未設定の値を持つと考えました。 – celsound

関連する問題