2016-08-06 3 views
0

클래스가 Component이고 인터페이스가 IInventoriable입니다. 내가 에만 클래스의 개체의 목록을 가지고, this answer in Java과 비슷한 IInventoryable 인터페이스를 구현해야합니다.인터페이스를 구현하는 특정 클래스의 목록이 있습니다.

예 psuedocode -

public List<Component implements IInventoriable> Inventory; 

가 어떻게 이런 식으로 뭔가를 달성 할 수 /는 C#으로도 가능하다?

더 좋은 해결책은 서브 클래스 Component일까요? 일부 컨텍스트에서는 Unity와 같은 많은 게임 엔진에서 볼 수있는 엔티티 구성 요소 시스템을 사용하고 있습니다.

+0

목록을 채울 때 linq'OfType'을 시도해 볼 수 있습니다. 리스트는 일 수 있지만 목록을 채우거나 필터링 할 때'IInventoriable'을 구현하는 Component 파생 객체 만 반환하는 linq 확장'Inventory.OfType ()'을 사용할 수 있습니다 – Nkosi

답변

3

목록을 채울 때 linq OfType을 시도해 볼 수 있습니다. 목록 List<Component> 수 있지만 그것을 채우기 또는 LINQ 확장 Inventory.OfType<IInventoriable>()를 사용하여 목록을 필터링 할 때 단지 Component 파생 개체를 반환하는 것을 또한 IInventoriable

또는

그 제약 자신의 목록 파생 된 제네릭 클래스를 만들 구현

public class InventoriableComponentList<T> : System.Collections.Generic.List<T> 
    where T : Component, IInventoriable { 

    public InventoriableComponentList() 
     : base { 

    } 

    public InventoriableComponentList(IEnumerable<T> collection) 
     : base(collection) { 

    } 
} 
+1

제약 조건이있는 List 파생 클래스는 대답. –

+0

@ Nkosi 초보자 질문에 사과드립니다.하지만이 유형의 객체를 어떻게 선언합니까?'public InventoryList '내 최선의 추측이지만 작동하지 않습니다. –

+0

당신은 먼저'Component, IInventoriable'에서 상속받은 클래스를 가져야합니다. 'public class ExampleClass : Component, IInventoriable {}'과 같이 선언 할 수 있습니다. 그리고'public InventoryList {get; set;}'이 속성으로 선언 된 경우 – Nkosi

2

유형 매개 변수 없이는 가능하지 않다고 생각합니다. 유형의 당신은 당신이 당신의 클래스 다음 항상 Component implements IInventoriable 될 것이다 제약과 유형 PARAM을 줄 수

int Method<T>(List<T> inventory) where T : Component, IInventoriable { ... } 

뭔가를 할 수 있지만, 당신은 아마 그것을 설정하는 방법을 파악해야 할 것이다 PARAMS 다른 유형의 PARAM없이 가능하지 않을 것입니다 후 다른 ...


그러나 몇 가지 다른 옵션이 있습니다 :

  • 분리합니다 IInventoriable 기능 FR 구성 요소를 끕니다. 예를 들어 Component 개체의 인스턴스 변수는 inventoryItem이며 IInventoriable입니다. 구성 요소의 발명품이 아닌 경우 inventoryItemnull이됩니다. 그런 다음 Component 기능을 사용하지 않을 경우는
  • , 단지 List<IInventoriable>
  • 이이 inventoryItem의 대신
  • 가 인터페이스에 Component를 확인 구성 요소의 목록의 목록을 확인하고 IInventoriable 인터페이스 implement
  • 모든 IInventoriable 개체가 Components이어야한다는 것을 확실히 알고 있다면 런타임 검사를 수행하십시오. List<IInventoriable>이 필요하고 필요할 때 구성 요소로 전송
관련 문제