枚举器重载+运算符

本文关键字:运算符 重载 枚举 | 更新日期: 2023-09-27 18:00:11

我有一个接口,在本例中我们将其称为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并将重载运算符放入其中的新类(或者我可以吗?)

谢谢!!

枚举器重载+运算符

在任何版本中,都不可能覆盖接口上的运算符。

您应该制作一个static方法,该方法使用params IEnumerable<T>[]yield return,所有这些都使用双foreach

建议回答我自己的问题:

我可以为每个魔法人物创建一个基类:

public abstract class MagicPerson : IMagicPerson
{
    protected List<MagicPower> powers;
    public IEnumerable<MagicPower> Powers { get { return powers; } }
}

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