Я читал это wiki article о составе над наследованием, и в примере они использовали абстрактный класс. Предположим, вы хотели избежать полного использования абстрактных классов и использовать только конкретные классы. Я хочу знать, мой пример - правильное использование композиции. Предположим, у меня есть следующий интерфейс IGameobject.Композиция над наследованием - избегать абстрактных классов
public interface IGameObject
{
string Name {get;}
}
и follwing интерфейс оружие:
//Note the IGameObject getter
public interface IWeapon
{
int Damage {get; }
IGameObject gameObject {get;}
}
Обычно, в моей игре, оружие есть- IGameObject. Однако, учитывая, что мы используем композицию, согласно статье wiki, это имеет отношение.
Теперь, я мог бы сделать это при создании объекта Sword:
public class Sword : IWeapon
{
private IWeapon weaponObject;
public Sword(IWeapon weapon)
{
this.weaponObject = weapon;
}
public int Damage
{
get
{
return this.weaponObject.Damage;
}
}
public IGameObject gameObject
{
get
{
return this.weaponObject.gameObject;
}
}
}
теперь я могу хранить свой меч в коллекции, например, список:
List<IWeapon> weapons = new List<IWeapon>();
weapons.add(swordObj)
и все еще имеют доступ к моему IGameObject.
Теперь у меня есть 3 вопроса:
- ли я правильно реализовать состав?
- Должен ли мой класс Sword реализовать интерфейс
IGameObject
? - Как хорошо, что мой IWeapon содержит
IGameObject getter
? (Причина, если хранить его в качестве IWeapon, без IGameObject добытчика, то как бы я получить подробную информацию оIGameObject
?)
Это выглядит очень странно - ваш класс «Sword» - это всего лишь обертка вокруг «IWeapon». – Lee
Есть ли причина, по которой вы избегаете методов добавления поведения на своих интерфейсах и придерживаетесь свойств? –
Это не имеет. Это - потому, что один и тот же объект имеет несколько аспектов. Это не поддается составу. Состав не лучше наследования. Это для разных вещей. – usr