2012-03-19 14 views
9

質問タイトルが示唆するように、私はAction<string>をインターフェイスに追加したいと思います。これは可能ですか?現時点では、それはあなたがプロパティとして追加する必要があると思いInterfaces cannot contain fieldsアクションに<string>アクションを追加するにはどうすればよいですか?

+0

代理店を契約/インターフェースに追加するのは悪い設計です。 –

+0

@KirillPolishchukあなたはそれを説明する/証明することができますか? – anatol

答えて

22

言う:

public interface IYourInterface 
{ 
    Action<string> YourAction { get; set; } 
} 

を取得/設定しなければ、それはただのフィールドだし、コンパイラが指摘するようにインタフェースがフィールドを含めることはできません。 (もちろん、それは簡単な自動プロパティかも知れません)これは、このインターフェイスを実装するときには、同様に実際のプロパティを指定する必要がありますことを意味しない:あなたが、その後からあなたAction<string>を使用することができることを考えると

public class Foo : IYourInterface 
{ 
    public Action<string> YourAction { get; set; } 

    // ... 
} 

をインターフェース:

IYourInterface iFoo = new Foo(); 

iFoo.YourAction = s => Console.WriteLine(s); 

iFoo.YourAction("Hello World!"); 

ハンスは、あなたがしたい場合は、あなたのインターフェイスにだけget(あるいは単にset)を示すことができ、示されたように。これはクラスに他のクラスを持たせることができないことを意味するものではなく、インターフェイスを通じてアクセスできないことを意味します。たとえば:

public interface IYourInterface 
{ 
    Action<string> YourAction { get; } 
} 

public class Foo : IYourInterface 
{ 
    public Action<string> YourAction { get; set; } 
} 

は、したがって、上記のコードでは、あなたは、インターフェイスを介してのみgetとしてYourActionプロパティにアクセスすることができますが、あなたはFooクラスからsetまたはgetそれをできました。

+0

追加の注記として、インターフェースでは、 "get"だけを指定することができます: 'Action YourAction {get; } '、それを実装に委ねる方法/「セット」を提供するかどうか。 –

+0

非常に真です。あなたはそれがセットを持っていることだけを指定することもできます(これはやや役に立たないですが)。 –

0

インターフェイスにはフィールドを含めることはできませんが、インターフェイスにはプロパティを含めることができるため、そのように追加できます。

0

私は引用:

「インターフェイスは、メソッド、プロパティ、イベント、インデクサ、またはこれら4つのメンバー型のいずれか 組み合わせからなるインタフェースは 定数、フィールド、演算子、インスタンスコンストラクタ、デストラクタを含めることはできません。 。、または タイプは静的メンバを含めることはできません、「インターフェイスのメンバーは 自動的に公開され、それらが任意のアクセス修飾子を含めることはできません

アクションフェイルドであるから - 。それができませんでしたインタフェースの一部 http://msdn.microsoft.com/en-us/library/ms173156.aspx

+5

誰がフィールドでなければならないと言いますか?それは財産でもあります。 – rideronthestorm

関連する問題