Поле принадлежит классу, но как использовать полиморфизм

У меня есть метод в базовом классе

class Base
{
   private static string Colour = "blue";
   string DoStuff() { return ColourProp; }

   protected virtual string ColourProp { get{ return Base.Colour; } }
}

который вызывается для экземпляра этого подкласса

class Sub
{
   private static string Colour = "orange";

   protected override string ColourProp { get{ return Sub.Colour; } }
}

На данный момент я использую виртуальные свойства, это единственный способ? (учитывая, что поля не могут быть виртуальными)...


person geejay    schedule 04.08.2009    source источник


Ответы (2)


Да, для этого вам нужно использовать либо виртуальное свойство, либо виртуальный метод. CLR будет динамически отправлять все вызовы ColourProp в зависимости от типа объекта (т. е. полиморфизма).

person Andrew Hare    schedule 04.08.2009
comment
да, это нормально, но мне просто интересно, так как в идеале (для моей проблемы) поля цвета принадлежат классу, а не экземпляру... может быть, я могу использовать отражение или что-то еще для динамического вызова типа??? - person geejay; 04.08.2009
comment
Они могут принадлежать классу, но вы не можете применять полиморфизм к статическим членам, и нет, использование отражения для этого представляет собой запах. Может быть, вы могли бы сделать шаг назад и описать, чего вы пытаетесь достичь на более высоком уровне? - person Eric Smith; 04.08.2009
comment
Хорошо, я признаю, что это излишество и вонючий, чтобы сделать это. Мне просто интересно, есть ли способ добиться полиморфизма, подобного поведению, с переменными класса (в основном просто для того, чтобы вырезать это дополнительное свойство из каждого подкласса, поэтому все, что мне нужно сделать, это определить поле, а затем оно используется суперклассом). - person geejay; 04.08.2009

Это выглядит совершенно нормально. Не беспокойтесь о виртуальной собственности. Это обеспечивает не только инкапсуляцию ваших данных по отношению к другим объектам, но и по отношению к подклассам.

person h0b0    schedule 04.08.2009