我有一个接口,在本例中我们将称之为IMagicPerson
public interface class IMagicPerson : IPerson
{
IEnumerable<MagicPower> Powers { get; }
}有几个东西继承了IMagicPerson,然后一些其他类也从它们派生出来,等等,导致了一些相当长的派生层次结构。其中每一个都需要能够声明其中的一些权力,但也必须使用派生类的权限。
我玩过各种各样的方法。我用过:
一个可以通过多个base.Powers
MagicPowerCollection类,就好像它是一个枚举器(使用yield return语句),并使用它将private static MagicPower[]添加到MagicPowerCollection的另一个构造函数中,该构造函数可以将单个权限添加到枚举器的末尾(同样,使用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并将重载的运算符放入其中的新类(或者可以吗?)
谢谢!!
发布于 2011-06-24 15:16:07
在任何版本中,完全不可能在接口上覆盖操作符。
您应该创建一个static方法,该方法接受一个params IEnumerable<T>[]和yield return,所有这些都使用双重foreach。
发布于 2011-06-24 15:42:58
就我自己的问题提出一个答案:
我可以为每个魔术师创建一个基类:
public abstract class MagicPerson : IMagicPerson
{
protected List<MagicPower> powers;
public IEnumerable<MagicPower> Powers { get { return powers; } }
}然后在派生类的构造函数中添加到此powers列表中。
https://stackoverflow.com/questions/6469834
复制相似问题