Проблема: Воины сражаются с оружием в поле битвы.
Принимая ситуацию в изображении,
скажем, у нас есть классный воин, который реализует Оружие.
Оружие может распространяться на меч, пистолет и т.д.
У меня есть путаница, будь то Оружие должно быть интерфейсом или абстрактным классом.
Если это должен быть интерфейс, то какое преимущество над ним.
[Редактировать]
Если это интерфейс, я считаю, что реализация будет такой.
Weapon myWeapon;
myWeapon = new Sword();
Итак, сначала - Воин не должен выполнять Оружие определенно.
Реализация интерфейса или расширение класса представляет собой взаимосвязь. Оружие - это Оружие, но Воин - нет. Он просто использует Оружие, которое представляет собой композицию - отношения HAS A.
Оружие, вероятно, должно быть интерфейсом
Интерфейс - это то, что говорит, что можно сделать с объектом класса, реализующего этот интерфейс. Он не говорит, как это достигается. Это разделение полезно для вашего чистого дизайна.
Если существует какое-либо общее поведение, которое разделяет все оружие или некоторые из них, вы можете ввести абстрактный класс, который в иерархии может стоять между интерфейсом и конкретной реализацией. Обратите внимание на это (это распространенная ошибка), что поведение не означает добавление нового метода. Поэтому, если вы, например, думаете, что пушка может быть перезагружена, поэтому для нее нужен другой метод, абстрактный класс здесь не поможет. В этом случае вы можете ввести другой интерфейс, например, Reloadable и сделать Gun орудием как Weapon, так и Reloadable. Общее поведение происходит только тогда, когда некоторые конкретные классы реализуют некоторый метод интерфейса одинаковым или похожим образом. Тогда абстрактный класс может реализовать этот один метод, но остальное не будет реализовано.
Кроме того, что воин не является оружием, а использует оружие... ;-)
myWarrior
будет мечом? Воины в целом не мечи.