2009-03-08 6 views
16

私は、そのインターフェイスのプロパティにsetアクセサを提供することによって、インターフェイスを拡張しようとしています。C#のインターフェイスのプロパティに 'set'を追加します。

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

私は継承が必要になります。

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

私はこのような何かをしたい:インタフェースは次のようになります。 IUserの本文をIMutableUserにコピーして、設定したアクセサーを追加することはできません。

これはC#で可能ですか?もしそうなら、どのように達成できますか?

答えて

12

私はあなたが投稿したことは動作しない理由何らかの理由が表示されませんか?ちょうど簡単なテストを行い、それは問題なくコンパイルされますが、隠すことについての警告が表示されます。これは、次のように新しいキーワードを追加することで解決できます。

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

代替方法は明示的な設定方法を追加することです。例:

public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

もちろん、私はセッターを使うのが好きですが、それができない場合は、あなたがしなければならないことをします。

+0

新しい機能が追加されました。ありがとう!あなたは(他の人のための)例で答えを更新できますか? – strager

+0

実用的な観点からは、インタフェースは時間の経過とともに非常に悪化します。インターフェイスのすべての実装者は、この契約の変更ごとに壊れてしまいます。 –

+0

@PatrickPeters - そのコメントはSetUserNameメソッドを対象としていたとしますか?私は最初の選択肢に問題は見られません。実装者が適切なところで明示的な実装を行った場合、中断の可能性が排除されます。 – Maslow

8

あなたは、抽象クラスを使用することができます。

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

もう一つの可能​​性はこれを持っていることです。

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

IUserを継承するにはMutableUserが必要です。私は最初の方法を調べます。 – strager

+0

抽象クラスを使用すると機能します。しかし、それはここで最もエレガントな解決策ではないようです。可能な「より良い」回答のために少し質問を残しておきます。 – strager

7

インターフェイスを明示的に実装することで、インターフェイスのプロパティを「オーバーライド」できます。クリスの答えは、あなたが概説したシナリオに必要なものですが、クラスにゲッター/セッターが必要な少し複雑なシナリオを考えてみましょう。しかし、インターフェースはゲッターを定義するだけです。あなたは次のようにしてこの問題を回避することができます

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

明示的IUser.MyPropertyを実装することで、あなたは契約を満たします。ただし、公開MyPropertyを指定すると、オブジェクトのAPIは明示的なインターフェイスバージョンを表示することはなく、MyPropertyとget/setを常に使用します。

関連する問題