2011-02-04 5 views
1

다음과 같은 이기종 (일반) 연결된 목록 데이터 형식을 빌드 할 수 있습니까?자체 참조 일반 클래스 템플릿

class MyClass<TPrev, TNext> 
     where TNext : MyClass<TPrev2, TNext2> 
      where TPrev2 : MyClass<TPrev, TNext> 

편집 : 특히 정의되지 않은 새 유형 TNext2에 유의하십시오.

edit2 : 위의 스 니펫을 작성한대로 작동하지 않게 만드는 ...

+1

시도해 보셨습니까? 그랬을 때 무슨 일이 있었 니? –

+3

참조 : http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx –

+1

@Henk - 나는이 질문이 오늘 다음과 같았습니다. 블로그 게시물 :) – Oded

답변

2

아니요, 원하는 것을 모델링 할 수 없습니다. 당신이 할 수있는 :

class Link<TPrev, TValue, TNext> 
{ 
    public TPrev Prev { get; set; } 
    public TValue Value { get; set; } 
    public TNext Next { get; set; } 
} 

을하지만 당신은 할 수 없습니다

class Link<???, TValue, ???> 
{ 
    public Link<???> Prev { get; set; } 
    public TValue Value { get; set; } 
    public Link<???> Next { get; set; } 
} 

문제는 당신이 목록의 이전 및 다음 요소가 일부 제네릭 형식의 목록을해야한다는 선언하는 경우 , 무한 크기의 유형을 정의하려고 시도했습니다. 다음 노드는 기타 링크 유형의 경우 Link<T>이어야하고 사용자는 무한 회귀가되기 때문에 "이 다음 노드가 없습니다"라고 말할 방법이 없습니다.

0

아니요, TNext2 또는 TPrev2을 클래스 정의의 일부로 정의하지 않았기 때문에 불가능합니다. 기존 유형이 아니면 클래스 정의의 제네릭 유형 매개 변수가 아니면 일반 매개 변수를 가질 수 없습니다.

그러나 TPrev2이 기존 유형 인 경우 수행하려는 것처럼 제한 조건을 지정할 수 없습니다.

+0

분명히 내가 쓴 것은 작동하지 않습니다. 내가 그랬다면 나는 질문을 제기하지 않았을 것입니다. 문제는 어떻게 든 동등한 기능적 동작을 얻을 수있는 부분입니다. – user492922

+0

귀하의 질문에서 명확하지 않습니다. "다음과 같은 이기종 (일반) 연결된 목록 데이터 형식을 구축 할 수 있습니까?" – jason

+1

그럼 모델링하려고하는 것은 정확히 무엇입니까? 어쩌면 영어로 정교 할 수 있다면 C#으로 번역하는 데 도움을 줄 수 있습니다. – jason

0

흥미로운 아이디어에 대해서는 this blog entry을 살펴보십시오. 본질적으로 다음과 같이 할 수 있습니다.

public abstract class LinkedListBase<T> 
    where T : LinkedListBase<T> 
{ 
    public T Next { get; set; } 
    public T Previous { get; set; } 
} 
public class LinkedListImpl : LinkedListBase<LinkedListImpl> 
{ 
    public string Name { get; set; } 
    // all of the value properties go here... 
} 

기본적으로 값 자체에는 이전 및 다음 링크가 포함되어 있습니다.