Похоже, что вы неправильно кодируете информацию в свою иерархию классов. Было бы разумнее использовать другой шаблон, чем подкласс. Например, используйте только один класс (посетитель, или, возможно, вы можете назвать его потенциальным подписчиком, что бы ни было уместным) и кодировать информацию об услугах, на которые подписан данный объект, перемещая динамически изменяющееся поведение за шаблоном «Стратегия» или некоторые из них. В вашем примере очень мало деталей, но одна вещь, которую вы можете сделать на C#, - это создать свойство «подписчика», которое изменило бы поведение объекта при изменении состояния свойства.
Вот надуманный несколько связанных пример:
class Price
{
private int priceInCents;
private bool displayCents;
private Func<string> displayFunction;
public Price(int dollars, int cents)
{
priceInCents = dollars*100 + cents;
DisplayCents = true;
}
public bool DisplayCents
{
get { return displayCents; }
set
{
displayCents = value;
if (displayCents)
{
this.displayFunction =() => String.Format("{0}.{1}", priceInCents/100, priceInCents % 100);
}
else
{
this.displayFunction =() => (priceInCents/100).ToString();
}
}
}
public string ToString()
{
return this.displayFunction();
}
}
Вы, однако, можете, вероятно, использовать шаблон «State», как описано в GoF. но вам не нужно менять тип класса/объекта! – cruizer
даже с динамическим langauge. ИЗМЕНЕНИЕ ТИПА ОБЪЕКТА не всегда возможно. – TomTom
Большое спасибо за предложение шаблона «State» ... Wot Я пытаюсь сделать здесь, чтобы использовать подклассы и наследование, чтобы каждый раз, когда страница была визуализирована, вызывается соответствующий производный метод. Например, для не-подписчиков я хочу показать ссылку «Присоединиться сейчас». , тогда как для подписчиков я хочу показать ссылку на «Сегодняшняя специальность», а остальная часть страницы является общей для всех посетителей. – Chris