Возможный дубликат:
С# - Есть ли более эффективная альтернатива, чем это для типа включения?
Рассмотрим классику:
class Widget { }
class RedWidget : Widget { }
class BlueWidget : Widget { }
По большей части, в моем пользовательском интерфейсе, я могу рассматривать все Widget
то же самое. Однако есть небольшие отличия, которые мне нужны if
или switch
через.
Возможные подходы:
Индикатор Enum - задается конструктором
enum WidgetVariety { Red, Blue }
class Widget {
public WidgetVariety Variety { get; protected set; }
}
class RedWidget : Widget {
public RedWidget() {
Variety = Red;
}
}
// Likewise for BlueWidget...
switch (mywidget.Variety) {
case WidgetVariety.Red:
// Red specific GUI stuff
case WidgetVariety.Blue:
// Blue specific GUI stuff
}
Использовать is
Widget w = ...;
if (w is RedWidget) {
(RedWidget)w ...
}
else if (w is BlueWidget) {
(BlueWidget)w ...
}
Причина, по которой я прибегал к этому, - это 1) Большая часть кода уже несколько написана таким образом, но намного уродливее. 2) 90% кода идентичны - в основном только один столбец в GridView должен обрабатываться по-разному в зависимости от типа.
Что бы вы порекомендовали? (Или у кого-то есть лучшее решение?)
Изменить Я знаю, что, вероятно, мне порекомендуется шаблон посетителя, но это просто кажется сложным для редких, незначительных различий в этом случае.
Изменить 2
Таким образом, одна конкретная разница, которую я испытывал с трудом, - это столбец, который отличается от двух типов. В одном случае он извлекает значение bool
и присваивает это ячейке сетки. В другом случае он получает строковое значение.
Я предполагаю, что в этом случае должно быть очевидно, что я мог бы определить:
public object virtual GetColumn4Data();
public override GetColumn4Data() { return m_boolval; }
public override GetColumn4Data() { return m_mystring; }
Это сначала мне не нравилось, из-за использования object
. Однако это тип свойства, которое я назначаю в ячейке, поэтому , конечно это имеет смысл!
Слишком долго в офисе сегодня кажется...