2016-09-01 4 views
3

INavigationWrapper을 구현하는 View을 배치해야하는 클래스가 있습니다. 이렇게 정의하면 다음과 같습니다.제네릭 매개 변수에 클래스와 인터페이스를 어떻게 지정합니까?

public class NavigationStackLayout : Layout<T> where T : View, INavigationWrapper 

그런 다음 다른 모든 곳에서 T를 지정해야합니다.

public class NavigationStackLayout : Layout<View> 

또는

public class NavigationStackLayout : Layout<INavigationWrapper> 

다음 클래스 '아이들이 유형의 일부를 누락 : 그래서처럼 정의합니다. 이렇게 정의하면 다음과 같습니다.

public class NavigationStackLayout : Layout<View : INavigationWrapper> 

구문 오류입니다. 특정 하위 클래스를 지정하지 않고도 generic 매개 변수에 클래스와 인터페이스를 어떻게 지정합니까?

UPDATE :

이 명확하게하기 위해, 내가 Layout<T>를 보유하고 있지 않습니다, 그래서 난 그냥 내 제네릭이 아닌 클래스에 일반적인 방법을 추가 할 수 없습니다; Layout<T> 님의 기존 방법을 사용해야합니다. Layout<T>의 제약 조건이 where T : View이기 때문에 그들이 작동 할 것입니다.

나는 다음과 같은 작업을 할 것입니다 수있는 솔루션을 찾고 있어요 : 당신이 각 NavigationStackLayout 개체로 하나의 클래스를 넣어 사용하면 일반적인 경로를 이동하고 정적 메서드를 추가 할 수 괜찮 가정

class View1 : View, INavigationWrapper {} 
class View2 : ContentView, INavigationWrapper {} // ContentView is a subclass of View 
class View3 : View 

var stack = new NavigationStackLayout(); 
stack.Add(new View1()); // this works 
stack.Add(new View2()); // this also works 
stack.Add(new View3()); // this fails at compile time 
+1

'보기 '는 이미'INavigationWrapper'을 구현합니까? 그렇지 않으면 두 유형의 멤버에 액세스하려면 하위 유형이 필요합니다. 또는'View' 서브 클래스가 파생 된'INavigationWrapper'를 구현하는'View'의 파생 클래스를 생성 할 수 있습니다. – Maarten

+0

아니요, '보기'는 없습니다. 나는 특별한 하위 타입을 염두에 두지 않고 단지'INavigationWrapper'를 구현하는'View'를 추가 할 수 있기를 원합니다. – Simon

+0

"그 밖의 모든 곳에서 T를 지정해야합니다."라는 말의 의미를 명확히 할 수 있습니까? 여기에 귀하의 불만 사항은 무엇입니까? 너는 무엇을 피하려고하는거야? –

답변

0

을 인스턴스를 일반적인 방식으로 생성하고 generic 매개 변수의 이름을 지정하지 않아도되는 별도의 비 제네릭 클래스에 추가합니다.

지나치게 일반적인 코드는별로 번거롭지 않으므로 구체적인 클래스를 선택하십시오.

최종 옵션으로 모든 기능을 일반으로 재 구현할 수 있고 유형을 제한 할 수 있습니다. 기본 스토리지에 대해 하나의 유형 또는 다른 유형을 선택하고 꺼낼 때 캐스트 할 수 있습니다.

근본적인 문제는 일반 매개 변수를 채우기 위해 유형이 필요하다는 것입니다. 당신은 펀트하고 다른 사람에게 선택 (일반)을하거나 존재하는 단일 유형을 선택하도록 요청해야합니다 (따라서 View 또는 INavigationWrapper).

다음 형식을 단일 레이아웃에 공존 시키려면 형식 안전성에 대한 규칙을 약간 구부리십시오 (예 : 저장소에 임의의 기본 클래스 선택).

class View1 : View, INavigationWrapper 
class View2 : View, INavigationWrapper 
+0

왜 규칙을 왜곡해야합니까? 제약 조건을 추가하고 아무것도 허용하지 않습니다. – Simon

+0

@ 사이먼 (Simon) : 어떤 단일 유형을 언급하고 있습니까? 이름을 지정할 수 있다면 유형 안전성을 가질 수 있습니다. C#에는 제네릭 제약 조건을 제외한 제약 조건이 없습니다. – Guvante

관련 문제