2014-01-16 36 views
1

我有一個接口IBakeable<T>每個有一個事件OnCooked了StyleCop和MultipleGenericInterfaces和CA1033

幾個數據類的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 states

如果派生類型重新器械(明確地)繼承 接口的方法,所述基體實現可以不再被訪問。 通過當前實例引用的調用將調用派生實現的 ;這會導致遞歸和最終堆棧溢出。

注意添加

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

不能解決規則。

我必須壓制這個規則嗎?還是有辦法修復它?

+0

這是糟糕的代碼味道。當烤箱要用來烤蛋糕和磚塊時,你要做什麼?添加更多的接口和事件?熱源很適合發射正確的事件。如果有人對它使用* something *感興趣,那麼它需要自己的事件來顯示所做的事情。 –

回答

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

我真的不知道如何這有助於我對於漢族的意見,以烹飪更多的事情,我需要添加更多的特性