2011-06-24 100 views
0

我有一個接口,在這個例子中,我們會打電話給IMagicPerson重載+操作統計員

public interface class IMagicPerson : IPerson 
{ 
    IEnumerable<MagicPower> Powers { get; } 
} 

有幾件事情繼承IMagicPerson,然後是一些其他類從中獲得太大,等等,引起一些相當長的派生體系。這些都需要能夠聲明這些權力的一部分,但也必須使用派生類的權力。

我已經玩過各種各樣的做法。我用:

  • 一個MagicPowerCollection類,它可以通過多種MagicPower枚舉枚舉,好像它是一個枚舉(使用yield return報表),並以此來增加一個private static MagicPower[]base.Powers
  • 使用MagicPowerCollection的另一個構造可以添加單個列強枚舉結束(再次使用yield returns

但我真的喜歡去了解這個問題的方法是通過

  • 超載的IEnumerable的+運營商允許添加更多的普查員或單國

這是一個糟糕的方式做到這一點?我認爲這看起來相當不錯。例如,我可以有:

public class Wizard : IMagicPerson 
{ 
    public override IEnumerable<MagicPower> Powers 
    { 
     get 
     { 
      AllPowers.AntiGravity + AllPowers.BroomStick; 
      //note: AllPowers, in this example, is a static class and all the properties return a MagicPower or type derived from MagicPower 
     } 
    } 
} 

public class EvilWizard : Wizard 
{ 
    public override IEnumerable<MagicPower> Powers 
    { 
     get 
     { 
      return base.Powers + AllPowers.InstantDeath + AllPowers.MindControl; 
     } 
    } 
} 

所以,在這裏,我怎麼會以這樣的方式重載+操作?我需要能夠將MagicPower添加到統計員或另一個MagicPower。兩者都將返回IEnumerator<MagicPower>

我也會接受關於其他實現此方法的其他建議,其中不包括重載此運算符。

注:

裸記住我使用C#2.0,所以擴展方法是不行的(雖然我強烈考慮升級該服務器只爲這)。

另一個複雜的是,雖然權力通常對於每種類型的MagicPerson相同,也有可以僅在某些情況下使用(例如,某些Wizards不能在麻瓜世界使用權力某些權力:d)。我不問如何做到這一點,我只能使用if語句或在其他地方添加這些屬性。讓人們知道一個完全靜態的解決方案是行不通的。

另一件事記裸露的是,我沒有訪問IMagicPerson接口,所以我甚至無法獲得屬性返回繼承IEnumerable的一個新的類,並把重載運營商在那裏(或我可以嗎?)

謝謝!!

+0

如果我在一段代碼中看到了這種語法,我不知道它試圖達到什麼目的。如果需要向可能會看到代碼的人解釋這個新語法,我認爲不值得花費這些時間。 – unholysampler

+0

這是我詢問這是否「壞」的原因之一,並表示我會接受其他解決方案,但不包括超載運營商。你會如何實現這一目標? – Connell

回答

1

在任何版本的接口上覆蓋運算符是完全不可能的。

你應該做一個static方法,它接受params IEnumerable<T>[]yield return一切都他們使用雙foreach

+0

但是我擁有'MagicPower'類,我可以重寫操作符?此外,您的解決方案與我在該問題中給出的「MagicPowerCollection」類完全一樣。由於我在問題底部的註釋部分給出的原因,這並沒有真正起作用。 – Connell

+0

好吧,我的意思是使用迭代器方法而不是類。我不明白爲什麼這不起作用;你的第二個音符不清楚。 – SLaks

+0

靜態方法比全新的類更清潔。對不起,該筆記不清楚(想不到更好的方式來說)。在你的解決方案中,我不得不爲另一個枚舉器聲明另一個枚舉器,這以前我是作爲靜態方法做的,但是我可以'返回CombinePowers(base.Powers,GetMyPowers())'並創建GetMyPowers爲每個班級? – Connell

0

要提出一個答案,我自己的問題:

我可以爲每個人的魔創建一個基類:

public abstract class MagicPerson : IMagicPerson 
{ 
    protected List<MagicPower> powers; 

    public IEnumerable<MagicPower> Powers { get { return powers; } } 
} 

然後添加到這個列表powers在派生類的構造函數。

+0

有誰知道這是否會比'yield return'語句使用更多的資源? – Connell