Comments 12
Что вы имеете ввиду?
Либо на своем визарде сделайте список классов оружия, которое он может надевать. Либо на оружии список классов игрока, которые его могут надевать.
Всё это надо выражать в данных, а не коде. Иначе геймдизайнер ничего не сможет настроить без программиста.
Спасибо за перевод. Жду следующие части.
Интересно как вы будете решать проблемы, которые очевидно следуют далее:
Посох не один, их много типов, так как как и условный меч
Для использования конкретного посоха/меча необходим N уровень персонажа
Персонаж определяется не типом жестко фиксированным, а набором статов
Игрок может перекидывать статы, что может в любой момент превратить персонажа из война в мага и наоборот
Маг все таки может иметь меч, но зачарованный допустим
Мне кажется, в этом примере ограничение средствами системы типов - изначально провальная идея, потому что получится такой клубок, который при критическом кол-ве условий просто невозможно будет распутать.
Очевидно, что проблема решается иначе - всё оружие разбивается на типы, например "одноручное", "двуручное", "посохи", "огнестрел", etc. Под каждый тип заводится интерфейс/базовый класс, и эти интерфейсы используются в потомках базового класса игрока, но никак не в базовом.
Да, я понимаю, что тут не совсем удачный пример выбран, но это решение для данной задачи.
public interface IPlayer
{
Weapon Weapon { get; }
}
public class Wizard : IPlayer
{
public Weapon Weapon => Staff;
public Staff Staff { get; set; }
}
Так не подойдёт? всё равно при "установке" оружия нужно знать тип
Что-то я так и не увидел своего варианта, позволяющего сохранить и LSP, и полиморфизм подтипов.
abstract class Player
{
public abstract bool CanHoldWeapon(Weapon weapon);
/// <exception cref="WeaponNotSupprtedException"></exception>
public abstract Weapon Weapon { get; set; }
}
Попытка выдать меч волшебнику всё ещё исключение, но теперь оно ожидаемое.
Ну или даже вот так можно:
abstract class Player
{
public abstract bool CanHoldWeapon(Weapon weapon);
public abstract Weapon Weapon { get; }
public abstract bool TrySetWeapon(Weapon weapon);
}
Воины и волшебники, часть вторая