У меня есть интерфейс, который в этом примере мы будем называть 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, и поместить туда перегруженные операторы (или я могу?)
Спасибо !!