1

我有一个IBakeable<T>有事件的界面OnCooked

几个数据类PieBread

我有一个实现IBakeable<Pie>IBakeable<Bread>

为了实现这一点,我认为我必须明确地实现接口

public class BaseHeatSource: IBakeable<Pie>, IBakeable<Bread>
{
    private event EventHandler OnPieCooked;
    event EventHandler IBakeable<Pie>.OnCooked
    {
        add {OnPieCooked+= value;}
        remove {OnPieCooked-= value;}
    }

    private event EventHandler OnBreadCooked;
    event EventHandler IBakeable<Bread>.OnCooked
    {
        add {OnBreadCooked+= value;}
        remove {OnBreadCooked-= value;}
    }
}

并且类是继承的

public class Oven: BaseHeatSource
{

}

public class Fire: BaseHeatSource
{

}

现在我得到相当于:

CA1033 接口方法应该可以被子类型调用

使“BaseHeatSource”密封(如果该类先前已发布,则为重大更改),非显式实现该方法,或实现公开“IBakeable.OnCooked.add(EventHandler)”功能且对派生类可见的新方法.

Msdn 指出

如果派生类型重新实现(显式)继承的接口方法,则不能再访问基实现。通过当前实例引用的调用将调用派生实现;这会导致递归和最终的堆栈溢出。

请注意,添加

protected void AddOnBreadCookedHandler(EventHandler handler)
{
    this.OnBreadCooked += handler;
}

不解决规则。

我必须禁止这条规则吗?或者有没有办法解决它?

4

1 回答 1

0

通过组合解决了这个问题......

创建了一个抽象Bakeable<T>

public abstract Bakeable<T> : IBakeable<T>
{
    event EventHandler OnCooked;

    public Cooked(object sender)
    {
        var handler = this.OnCooked;
        if (handler != null)
        {
            handler(sender, new EventArgs());
        }
    }
}

创建了一个作为类的IBakeable<Pie>属性Bakeable<Pie>

用于触发事件BakeablePie.Cooked

为了附加到事件它只是变成了oven.BakeablePie.OnCooked += customerWantsPie.Eat

我真的不确定这对汉斯的评论有何帮助,以便烹饪更多我需要添加更多属性的东西

于 2014-01-17T13:19:53.450 回答