2015-03-02 39 views
0

我有一个通用的接口,它看起来像这样:实现通用接口与事件多次

public interface IObjectProvider<out T> 
{ 
    event Action<T> ValueOccured; 
} 

现在我想打一个类,它实现了该接口两次这样的:

public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar> 
{ 
    public event Action<Foo> IObjectProvider<Foo>.ValueOccured; 

    public event Action<Bar> IObjectProvider<Bar>.ValueOccured; 
} 

并不能得到它的工作,因为这个编译器说我需要使用正确的语法,如果我做非显式实现我(如预期)得到一个错误:

Member is already declared.

我该如何解决这个问题?

+1

试试这个:GlobalReceiver:IObjectProvider ,IObjectProvider rducom 2015-03-02 11:43:04

+2

好如图所示类**不**实现所示的界面 - 它应该是这样的'公共类GlobalReceiver:IObjectProvider ,IObjectProvider ' – RobV 2015-03-02 11:44:27

+0

您的问题是非常不清楚。你甚至没有实现你自己的接口类型。除了应该发生什么以外呢? – 2015-03-02 11:51:20

回答

7

你必须明确地告诉如何实现对事件addremove,因为它是一个显式接口实现:

public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar> 
{ 
    private event Action<Foo> ActionFoo; 

    event Action<Foo> IObjectProvider<Foo>.ValueOccured { add { ActionFoo += value; } remove { ActionFoo -= value; } } 

    private event Action<Bar> ActionBar; 

    event Action<Bar> IObjectProvider<Bar>.ValueOccured { add { ActionBar += value; } remove { ActionBar -= value; } } 
} 

我还说,你可能会使用的实际情况作出的默认实现他们可以从你的班级访问。

为什么?可能因为你不能从你的类中的成员名称中调用事件,所以调用事件处理程序将非常困难。

+0

您的代码工作,但我仍然不'',为什么编译器无法找出,基于类型(就像他在不同泛型类型参数的方法中那样)? – 2015-03-02 12:36:22

+0

每次你想调用事件处理程序时,你都必须施放'this''',这并不酷。这就是为什么你必须告诉如何实施它。 – 2015-03-02 12:37:26

+2

你也[可能想要使用锁](http://stackoverflow.com/questions/2205711/should-i-lock-event)。 – CodeCaster 2015-03-02 12:38:03