Я стараюсь придерживаться хороших принципов проектирования и дизайна дизайна и т. Д. Поэтому, разрабатывая это приложение на C#, я часто могу найти несколько решений для проектирования и архитектуры, я всегда хочу найти и реализовать более «канонический» в надежде создать высокоподдерживаемое и гибкое программное обеспечение, а также стать лучшим программистом OO ,Обеспечение безопасности типов унаследованных элементов в унаследованных классах
Предположим, у меня есть эти два абстрактных класса: Character
и Weapon
.
abstract class Weapon
{
public string Name { get; set; }
}
abstract class Character
{
public Weapon weapon { get; set; }
}
Производные классы могут быть Sword
и Staff
от Weapon
и Warrior
и Mage
от Character
и т.д. (это все гипотетических, не имеет отношение к моему реальному программному обеспечению!).
Каждый Character
имеет Weapon
, но для каждой реализации Character
Я знаю, что реализация Weapon
она будет иметь. Например, я знаю (и я хочу обеспечить соблюдение!), Что во время выполнения каждый экземпляр Warrior
будет иметь Weapon
типа Sword
. Конечно, я мог бы сделать это:
class Sword : Weapon
{
public void Draw() { }
}
class Warrior : Character
{
public Warrior()
{
weapon = new Sword();
}
}
Но этот путь, каждый раз, когда я хочу использовать мой Weapon
объект правильно внутри Warrior
, я должен выполнить бросок, который я считаю, чтобы быть не столь большой из практика. Кроме того, у меня нет никаких средств, чтобы помешать мне испортиться, то есть нет безопасности типа!
Идеальным решением было бы иметь возможность переопределить Weapon weapon
свойство в Warrior
классе с Sword weapon
собственности, таким образом у меня есть безопасность типа, и если пользователь использует мой Warrior
как Character
, он все еще может использовать свой Sword
, как a Weapon
. К сожалению, похоже, что C# поддерживает такую конструкцию.
Итак, вот мои вопросы: это какая-то классическая проблема OO с именем и хорошо документированным решением? В этом случае я очень хотел бы узнать название проблемы и решения. Некоторые ссылки на хорошие материалы для чтения были бы очень полезными! Если нет, то какой классный класс вы предложили бы для поддержания функциональности и обеспечения безопасности типа элегантным и идиоматическим способом?
Спасибо за чтение!
«каждый раз, когда я хочу использовать свой объект оружия должным образом» - можете ли вы привести пример того, что не является «правильным»? – mungflesh
Правильное значение без необходимости приведения. Разве вы не согласитесь, что если каждый раз, когда я использую объект, я должен его бросить, в дизайне что-то не так? – WHermann
Согласен, но я не понимаю, почему вам нужно бросить. – mungflesh