저는이 상속을 통해 합성에 대해이 wiki article을 읽었으며 예제에서는 추상 클래스를 사용했습니다. 추상적 클래스를 완전히 사용하지 않고 구체적인 클래스 만 사용하는 것을 원하지 않는다고 가정 해 보겠습니다. 나는 나의 예가 구성의 적절한 사용인지 알고 싶다. 다음 IGameobject 인터페이스가 있다고 가정 해 보겠습니다. Composition Over 상속 - 추상 클래스 피하기
public interface IGameObject
{
string Name {get;}
}
와 follwing을 무기 인터페이스 :
//Note the IGameObject getter
public interface IWeapon
{
int Damage {get; }
IGameObject gameObject {get;}
}
일반적으로, 내 게임, 무기 는-A을 IGameObject. 그러나 우리가 위키 기사에 따르면, 그것은 -의 관계에 따라 작곡을 사용하고 있다고 생각합니다. 칼 개체를 만들 때
이제, 나는이 작업을 수행 할 수 있습니다 :
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 개 질문 :
- 내가 제대로 구성을 구현 있나요?
- 내 소드 클래스도
IGameObject
인터페이스를 구현해야합니까? - IWeapon에
IGameObject getter
이 포함되어 있어도 괜찮습니까? (나는 어떤을 IGameObject 게터와 더불어, IWeapon로 저장하는 경우 그 이유는, 어떻게 그때는IGameObject
의 세부 사항을 얻을 것입니까?) 상속 대
이것은 매우 이상하게 보입니다.'Sword' 클래스는'IWeapon'을 감싸는 래퍼 일뿐입니다. – Lee
행동을 피하는 이유가 있습니까? 인터페이스에 메소드를 추가하고 대신 속성을 고수하고 있습니까? –
이것은 has-a가 아닙니다. 동일한 객체가 여러 측면을 갖고 있기 때문에 is-a입니다. 이것은 구성하기 쉽지 않습니다. 구성은 상속보다 낫지 않습니다. 그것은 다른 것들을위한 것입니다. – usr