2011-05-03 2 views
1

이라는 템플릿 클래스에 바인딩 될 때 함수를 동적으로 바인딩하는 경우 세 가지 다른 유형 A, B 및 C에서만 인스턴스화 될 템플릿 클래스가 있으므로 다른 클래스에 외부 함수 호출을 바인딩 할 수있는 방법이 있습니다. 서식 파일이 형식에 바인딩 될 때 서식 파일 형식?C# : 템플릿이

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print(obj); 
} 

class printer { 
    public Print(A obj){}; 
    public Print(B obj){}; 
    public Print(C obj){}; 
} 

이제 위의 내용을 이해할 수 없습니다. 다음 세 가지 클래스 대신 코드를 세 번 갖는 템플릿 (작성

1)의 선택 및 컴파일시 정적 바인딩 호출) 나에게 잎

. 인쇄 기능을 호출하는 기능을 동적 해상도 런타임의 객체 A, B 및 C, 및

class template<T> where T : IPrintable { 
    private printer myPrinter; 
    Print(T obj) {obj.Print()); 
} 

하지만이 이어질 것이다의 템플릿 변경에 포함되도록 설계 변경

2) 필자의 경우와 같이 바람직하지 않은 디자인에서는 Print 함수가 더 논리적으로 프린터에 더 많이 포함됩니다. 이 라인을 따라 동적 키워드, 뭔가를 사용

3) :

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print((dynamic)obj); 
} 

의 I는 상상 각 함수 호출에 일어날 여기에 바인딩.

그래서 저는 실제로 두 가지를 제거하는 프린터 클래스의 기능을 유지하고 코드를 여러 번 사용하지 않고 (1 개를 제거함) 모든 기능이 아닌 인쇄 기능을 동적으로 바인드하는 솔루션을 찾고 있습니다. 호출하지만 템플릿 초기화시 (3 제외).

기본적으로 템플릿을 만들 자마자 런타임 환경은 모든 호출에서 호출 할 함수를 알아야하며 함수가 호출 될 때마다 조회를 수행하지 않아도됩니다.

제 질문은 위와 같이 정확하게 생각합니까? 그리고 템플릿이 템플릿 유형에 바인딩 될 때 동적으로 바인드하는 방법이나 위에 설명 된 더 좋은 방법이 있습니까? 그리고 동적 클래스 대 다중 클래스를 사용하는 데 따른 오버 헤드는 무엇입니까?

감사 클래스 printer 일반적인 방법

+1

@codymanix 그는 자신의 클래스 템플릿의 이름을 지정하는 것 같습니다. @ 쿠키 : 클래스에는 대문자를 사용하는 것이 좋습니다. – LueTm

답변

0

만들기 방법 Print. 일반적인 템플릿

class Printer 
{ 
    public Print<T>(T obj) 
    { 
    if(obj is A) DoLogicForTypeA(); 
    else if (obj is B) DoLogicforTypeB(); 
    else throw new IllegalArgumentException(); 
    } 
} 

전화는 :

Print(T obj) {myPrinter.Print<T>(obj); 

당신은 그것을 더 잘 작동하도록 일부 경우-제약 조건을 추가 할 수 있습니다.

+0

다시 말하지만, 이것은 내 인쇄 기능에 대한 충분한 자유를주지 못합니다. 기본적으로 if type = A, 내부 member subscriptionsForA, type = B, subscriptionsForB를 사용합니다. – Cookie

+0

if 구조로 편집했습니다. 'DoLogicForTypeA'와'DoLogicforTypeB'에 공통점이 많다고 생각한다면, 공통 항목에 대한 인터페이스를 정의하고 constaint를 정의하십시오. 'where T : InterfaceCommonToTypes'. 그러면'obj '를 사용할 수 있습니다.Print (T obj)'메서드 내에서 InterfaceCommonMethodOrProperty를 호출해야합니다. – ZoolWay

관련 문제