我有一个界面,在本例中我们将调用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
)但我真正喜欢的方式是
这是一个不好的方法吗?我觉得它看起来很不错。例如,我可以:
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 :(得分:1)
在任何版本的界面上覆盖操作符是完全不可能的。
您应该制作一个static
方法,使用双倍params IEnumerable<T>[]
来获取yield return
和foreach
个所有方法。
答案 1 :(得分:0)
建议回答我自己的问题:
我可以为每个魔术师创建一个基类:
public abstract class MagicPerson : IMagicPerson
{
protected List<MagicPower> powers;
public IEnumerable<MagicPower> Powers { get { return powers; } }
}
然后在派生类的构造函数中添加到此powers
列表。