2011-11-04 6 views
8

C# 사용 다른 메타 정보 중에서도 유향 그래프의 루트 노드를 포함하는 클래스가 있습니다. 이것을 컨테이너 클래스이라고합시다. 이 컨테이너는 편집기 모드와 구성자 모드의 두 가지 모드로 나타날 수 있습니다. 모드에 따라 루트 노드의 유형은 입니다. NodeEdit 또는 NodeConfig (모두 동일한 서브 클래스에서 상속)상속 된 속성의 유형 변경 (상속 된 형식으로)

컨테이너
public abstract class NodeBase 
{ 
    string Name { get; set; } 
    ... 
} 

public class NodeEdit : NodeBase ... 
public class NodeConfig : NodeBase ... 

가, 나 또한 기본 클래스를 생성하고 상속 :

public abstract class ContainerBase 
{ 
    NodeBase Root { get; set; } 
    ... 
} 

ContainerBase에서 상속하여 편집기 - 및 Configuratorcontainer을위한 클래스를 만드는, 내가 유형되고 싶어 루트 - 부동산 (NodeBase에서 상속) 특정 같은 입력 :

public class ContainerEditor : ContainerBase 
{ 
    NodeEditor Root { get; set; } 
    ... 
} 

하지만 ContainerBase에 정의 된 속성의 유형을 변경할 수 없습니다. 이 문제를 해결할 방법이 있습니까? 나는 BaseNode 형을 사용하고 형 NodeEditor이 형 BaseEditor에서 상속되기 때문에

ContainerEditorInstance.Root = new NodeEditor(); 

같은 NodeEditor의 요소를 추가 할 수 있지만 컨테이너 - 편집기 클래스에서, 나는 명시 적으로 단지의 유형을 허용 할 수 있습니다 루트 속성은 노드 편집기입니다. 나는 setter에서 이것을 검사하고 NodeEditor 타입의 모든 노드를 거부 할 수 있지만, 특정 유형의 속성을 갖고 싶습니다. 그래서 컴파일 타임에 잘못된 할당을 감지 할 수 있습니다. 사전에

감사합니다,
프랭크

답변

4

당신은 그것을 재 선언 할 수 있습니다 :

public class ContainerEditor : ContainerBase 
{ 
    public NodeEditor Root { 
    get { return (NodeEditor)base.Root; } 
    set { base.Root = value; } 
    } 
    ... 
} 
+0

안녕하세요 마크, 답장을 보내 주셔서 감사합니다! 나는 이미 그것을 재 선언으로 시도했지만, 아마도 나는 잘못된 것을했을 것이다. 귀하의 접근 방식을 테스트하고 잘 작동합니다! 일반적으로 제네릭이나 그 반대로 재 선언을 선호하거나 동등한 상황이 있습니까? – Aaginor

+0

전체 일반 항목은 일반 기본 클래스, 즉 추상 반환 유형을 사용해야하는 경우 심각한 문제를 일으 킵니다.그래서 재 선언을 할 것입니다. 왜냐하면 그것은 덜 관입 적이기 때문입니다. 'new'및 'override'와 비교하여 내부에서 재 선언하는 방법은 무엇입니까? 추천 할만한 좋은 기사가 있습니까? 다시 한 번 감사드립니다! – Aaginor

9

사용 제네릭 : 당신이 유형을 지정하는 파생 클래스에서

public abstract class ContainerBase<TRoot> where TRoot : NodeBase 
{ 
    TRoot Root { get; set; } 
    ... 
} 

:

public abstract class ContainerBase<T> where T:NodeBase 
{ 
    T Root { get; set; } 
    ... 
} 

public class ContainerEditor : ContainerBase<NodeEditor> 
{  
    ... 
} 
+0

안녕 블라, 결코 보통 HashSet의 와 유사한 사용 옆에 제네릭 처리하지 그래서 당신은 다음처럼 작성할 것입니다. 이것이 아마 그들과 함께 일하는 좋은 시간이 될 것이라고 생각하십시오! – Aaginor

1

당신은 컨테이너 일반적인 기반을 만들 수 있습니다

public class ContainerEditor : ContainerBase<NodeEditor> 
{ 
    ... 
} 
+0

좋은 생각 이네. – Aaginor

0

여기서 좋은 해결책은 제네릭이라고 가정합니다.

public class ContainerEditor<T>:ContainerBase 
{ 
    T Root {get;set;} 
} 
+0

Editor 나 Configurator를 알 필요가없는 함수에서 액세스 할 수 있도록 ContainerBase의 루트를 선언해야합니다. 어쨌든 제네릭은 Guffa와 Blau가 보여준 좋은 아이디어처럼 들립니다. – Aaginor

관련 문제