枚举器的重载+运算符

时间:2011-06-24 15:13:30

标签: c# c#-2.0

我有一个界面,在本例中我们将调用IMagicPerson

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

一些东西继承IMagicPerson,然后其他一些类也从它们派生出来,依此类推,导致一些相当长的派生层次结构。这些中的每一个都需要能够声明其中的一些权力,但也必须使用派生类的权力。

我玩过各种各样的方法。我用过:

  • 一个MagicPowerCollection类,可以枚举多个MagicPower枚举器,就像它是一个枚举器一样(使用yield return语句)并使用它来private static MagicPower[]添加base.Powers < / LI>
  • 使用MagicPowerCollection的另一个构造函数,可以将单个Powers添加到枚举数的末尾(再次使用yield returns

但我真正喜欢的方式是

  • 重载IEnumerable的+运算符以允许添加更多枚举器或单个Powers

这是一个不好的方法吗?我觉得它看起来很不错。例如,我可以:

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的新类并将重载的运算符放在那里(或者我可以吗?)

谢谢!

2 个答案:

答案 0 :(得分:1)

在任何版本的界面上覆盖操作符是完全不可能的。

您应该制作一个static方法,使用双倍params IEnumerable<T>[]来获取yield returnforeach个所有方法。

答案 1 :(得分:0)

建议回答我自己的问题:

我可以为每个魔术师创建一个基类:

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

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

然后在派生类的构造函数中添加到此powers列表。