2012-02-10 13 views
1

私は、私が使用している一連のインターフェイスを持っています。彼らはIPatient、IDoctor、IPersonです。 IPersonには、すべての人物(名前、性別、住所など)の共有プロパティが含まれています。私はIDoctorとIPatientがIPersonを実装することを希望しますが、this can't be done in C# according to this question ..インターフェイス間の重複を排除する方法

IPatientとIDoctorの間でこれらの重複するプロパティを削除する方法はありますか?

+1

なぜあなたは 'IPerson'をインターフェースにする必要がありますか? 'Person'を抽象クラスとして記述するほうが良いのではないでしょうか?基本的な実装を単一の場所に提供し、必要な場合は派生クラスでのみオーバーライドするのが非常に便利なので、インターフェイスよりも抽象クラスを好む方が一般的です。 –

+0

私のメソッドは、インターフェイスをそれらのパラメータとして受け入れます。抽象クラスとして実装すると、抽象クラスのプロパティを使用する具体的なインスタンスにパラメータをキャストする必要があります。 –

+0

@BillMartinいいえ、あなたはいません。インターフェイスメソッドを呼び出すと、CLRはオブジェクトの実行時型のインターフェイスマップに基づいてオブジェクトの特定のメソッドを呼び出します。オブジェクトの実行時型の作成者は、明示的なインターフェイスメンバの実装を使用して、これを完全に制御します。オブジェクトをキャストする必要はありません。または私は問題を誤解していますか? – phoog

答えて

6

あなたが話している複製はどこですか?あなたは例を見れば:

interface IPerson 
{ 
    string Name { get; set; } 
} 

interface IDoctor : IPerson 
{ 
    string Specialty {get; set; } 
} 

class Doctor : IDoctor 
{ 
    public string Name { get; set; } 
    public string Specialty {get; set;} 
} 

は、ここには重複がありません - Doctorは一度だけNameプロパティを実装する必要があり、また、もちろんSpecialtyプロパティを実装する必要があります。

インターフェースはあなただけのインターフェース、ない性質の実装ことを与える(そしてそれはあなたがポリモーフィズムを活用するために、ほとんどの場合に望むまさにだ) - あなたはこれらのプロパティのデフォルトの実装が必要な場合は、あなたがしなければなりませんおそらくそれらのプロパティを実装する抽象基本クラスを使用します。

+0

はい、これは本当です。しかしおそらく彼の心配は 'class Patient:IPatient'も' Name'プロパティを実装しなければならないということです。 –

2

これは間違いなく可能です。リンクされた質問には、他のクラスがインターフェイスを実装できないという制約もあります。我々は、単に行うことができますナンセンス制約スクレイピング:

interface IPerson 
{ 
    string Name { get; } 
} 

interface IDoctor: IPerson 
{ 
    int DoctorSpecificProperty { get; } 
} 

interface IPatient 
{ 
    int PatientSpecificProperty { get; } 
} 
1

あなたが提供されたリンクに示すように、IPatientとIDoctorがIPersonを拡張することができ、両方の、あなただけのIPatientまたはIDoctorを実装せずIPersonを実装するから誰かを停止することはできません。

関連する問題