Перегрузка + оператор для счетчиков - PullRequest
0 голосов
/ 24 июня 2011

У меня есть интерфейс, который в этом примере мы будем называть IMagicPerson

public interface class IMagicPerson : IPerson
{
    IEnumerable<MagicPower> Powers { get; }
}

Несколько вещей наследуют IMagicPerson, а затем некоторые другие классы тоже наследуются от них, и так далее,вызывая довольно длинную производную иерархию.Каждый из них должен быть в состоянии объявить некоторые из этих способностей, но также должен использовать полномочия производного класса.

Я поиграл с различными способами сделать это.Я использовал:

  • A 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, существуют также некоторые полномочия, которые могут использоваться только в определенных ситуациях (например, некоторые * 1051)* не может использовать силы в мире магглов: D).Я не спрашиваю, как это сделать, я могу просто использовать операторы if или добавить эти свойства где-нибудь еще.Просто дать людям понять, что полностью статичное решение не сработает.

Еще одна вещь, о которой следует помнить, это то, что у меня нет доступа к интерфейсу IMagicPerson, поэтому я не могу дажеполучить свойство для возврата нового класса, который наследует IEnumerable, и поместить туда перегруженные операторы (или я могу?)

Спасибо !!

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Абсолютно невозможно переопределить оператор на интерфейсе, в любой версии.

Вы должны сделать метод static, который принимает params IEnumerable<T>[] и yield return s для всех, используя двойной-. foreach 1007 *

0 голосов
/ 24 июня 2011

Чтобы предложить ответ на мой собственный вопрос:

Я мог бы создать базовый класс для каждого магического человека:

public abstract class MagicPerson : IMagicPerson
{
    protected List<MagicPower> powers;

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

Затем добавить в этот список powers в конструкторахпроизводные классы.

...