2012-03-19 29 views
9

正如问题标题所示,我想在界面中添加Action<string>。这可能吗?目前,它说Interfaces cannot contain fields如何将Action <string>添加到界面?

+0

将代表添加到您的合同/接口是一个糟糕的设计。 – 2012-03-19 14:38:11

+0

@KirillPolishchuk你能解释/证明吗? – anatol 2017-12-01 04:56:12

回答

22

你需要将其添加为一个属性:

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

没有get/set方法,它只是一个领域,因为编译器指出接口不能包含字段。这也意味着,当你实现这个接口,您需要提供实际的属性,以及(尽管这显然可以是一个简单的自动属性):

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

    // ... 
} 

鉴于这种情况,您就可以使用您的Action<string>从接口:

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; } 
} 

所以在上面的代码中,你可以访问YourAction属性只为get通过该接口,但你可以set或从Fooget它。

+0

作为一个附加说明:在一个界面中,你可以指定只有一个“get”:'动作 YourAction {get; },将它留给实现如何/是否提供“集合”。 – 2012-03-19 14:37:43

+0

非常真实。你甚至可以指定它只有一个集合(虽然这有点用处不大) – 2012-03-19 15:00:58

0

一个接口不能包含字段,但它们可以包含属性,所以你可以这样添加它。

0

我引述:

“接口包括方法,属性,事件,索引,或者任何 这四个成员类型的组合而得到的接口不能包含 常数,域,操作符,实例构造函数,析构函数。 ,或 类型不能包含静态成员的接口成员 自动公开,而不能包含任何访问修饰符”

,因为行动是费尔德 - 它不能成为一个接口的一部分。 http://msdn.microsoft.com/en-us/library/ms173156.aspx

+5

谁说它必须是一个字段。它也可能是一个财产。 – rideronthestorm 2013-04-15 14:58:19

相关问题