首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载+枚举器的运算符

重载+枚举器的运算符
EN

Stack Overflow用户
提问于 2011-06-24 15:13:29
回答 2查看 250关注 0票数 0

我有一个接口,在本例中我们将称之为IMagicPerson

代码语言:javascript
复制
public interface class IMagicPerson : IPerson
{
    IEnumerable<MagicPower> Powers { get; }
}

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

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

一个可以通过多个base.Powers

  • Using枚举器枚举的MagicPowerCollection类,就好像它是一个枚举器(使用yield return语句),并使用它将private static MagicPower[]添加到MagicPowerCollection的另一个构造函数中,该构造函数可以将单个权限添加到枚举器的末尾(同样,使用yield returns)

)

但我更愿意这么做的方法是

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

这样做不好吗?我觉得挺好看的。例如,我可以:

代码语言:javascript
复制
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并将重载的运算符放入其中的新类(或者可以吗?)

谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-24 15:16:07

在任何版本中,完全不可能在接口上覆盖操作符。

您应该创建一个static方法,该方法接受一个params IEnumerable<T>[]yield return,所有这些都使用双重foreach

票数 1
EN

Stack Overflow用户

发布于 2011-06-24 15:42:58

就我自己的问题提出一个答案:

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

代码语言:javascript
复制
public abstract class MagicPerson : IMagicPerson
{
    protected List<MagicPower> powers;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6469834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档