枚举器重载+运算符
本文关键字:运算符 重载 枚举 | 更新日期: 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
列表中。