Проектирование моделей, открытых для расширения, но закрытых для модификации.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Проектирование моделей, открытых для расширения, но закрытых для модификации.

Сообщение Anonymous »

Предположим, у меня есть код модели, подобный приведенному ниже, с довольно большим количеством ссылок в существующей системе среднего размера:

Код: Выделить всё

public class House
{
public House(IEnumerable windows)
{
Windows = windows;
}

public IEnumerable Windows { get; private set; }

}

public class Window
{
public Window(string brand, int height, int width)
{
Brand = brand;
Height = height;
Width = width;
}

public string Brand { get; private set; }
public int Height { get; private set; }
public int Width { get; private set; }
}
Появилось новое требование. Частям системы необходимо знать, является ли конкретное окно устойчивым к солнечному излучению, однако другим частям это не важно, и они могут не знать, устойчиво ли окно к солнечному свету.
Мы могли бы расширить наш класс окна, чтобы представить возможность того, что окно будет устойчиво к солнечному свету.

Код: Выделить всё

public class WindowMaybeSolarResistant : Window
{
public WindowMaybeSolarResistant(string brand, int height, int width, bool isSolarResistant) : base(brand, height, width)
{
IsSolarResistant = isSolarResistant;
}

public bool IsSolarResistant { get; private set; }
}
Моя проблема: что делать с Хаусом? Система тесно связана с идеей, что в доме есть Windows.
Вместо этого мы могли бы просто добавить в окно еще один конструктор.

Код: Выделить всё

public class Window : IWindow
{
public Window(string brand, int height, int width)
{
Brand = brand;
Height = height;
Width = width;
IsSolarResistant = false;  //What if this is really true for the window though?  Could someone use the wrong constructor?
}

public Window(string brand, int height, int width, bool isSolarResistant)
{
Brand = brand;
Height = height;
Width = width;
IsSolarResistant = isSolarResistant;
}

public string Brand { get; private set; }
public int Height { get; private set; }
public int Width { get; private set; }
public bool IsSolarResistant { get; private set; }
}
Вместо этого дом может использовать дженерики? Это гарантирует, что окно имеет определенные свойства, но оставляет место для расширения.

Код: Выделить всё

public interface IWindow
{
public string Brand { get;  }
public int Height { get;  }
public int Width { get;  }
}

public class House where TWindow : IWindow
{
public House(IEnumerable windows)
{
Windows = windows;
}

public IEnumerable Windows { get; private set; }

}
Вы расширяете House, но кажется, что ситуация может выйти из-под контроля?

Код: Выделить всё

public class HouseCouldHaveSolarWindows : House
{
public HouseCouldHaveSolarWindows(IEnumerable windows) : base(windows)
{
}

public new IEnumerable Windows { get; private set; }
}
Надеюсь, мое недоумение имеет смысл. Я пытаюсь найти лучший способ расширить класс, связанный с другим классом, когда появляются дополнительные свойства, необходимые некоторым подразделам системы.
Я пытаюсь найти способ следовать принципу открытости/закрытости с моделями, чтобы мои модели были открыты для расширения (новые свойства) и закрыты для модификации.

Подробнее здесь: https://stackoverflow.com/questions/788 ... dification
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»