2010-05-12 3 views
0

간단한 문자열, IList<string> 또는 IList<OntologyStore>의 3 가지 타입을 취하는 제네릭 클래스를 만들려고합니다.3 가지 타입을 가진 제네릭 클래스를 만드는 법

public class OntologyStore 
{ 
} 

public sealed class jim<T> where T:new() 
{ 
    string J; 
    IList<string> X = null; 
    IList<OntologyStore> X1 = null; 

    public jim() 
    { 
     if (typeof(T) == typeof(String)) 
     { 
      J = string.Empty; 
     } 
     if (typeof(T) == typeof(OntologyStore)) 
     { 
      X1 = new List<OntologyStore>(); 
     } 
     if (typeof(T)==typeof(IList)) 
     { 
      X = new List<string>(); 
     } 
    } 
} 

내가 쉽게 일을 기대하는 만들 수

jim<OntologyStore> x1=new jim<jim<OntologyStore>() 

당신이 기대하는 것처럼,하지만 난

jim<string> x2=new jim<string>() 

에 넣어 때 컴파일러는 문자열이 아닌 것입니다보고 abtract 유형, 당신이 기대하는 것입니다.

문자열을 보유하는 클래스로 인스턴스화 할 수있는 일반 클래스를 만들 수 있습니까 아니면 IList<string> 또는 IList<OntologyStore>입니까?

+0

당신은 정말로 나를 혼란스럽게했습니다! 어떤 문제를 해결하려고합니까? – flq

+0

클래스 이름을 고유 한 이름 이외의 이름으로 지정하면 쉽게 대답 할 수 있습니다. 'jim' 또는'bob'이라는 클래스를 참조하는 것은 혼란 스럽습니다. – LBushkin

+0

내 게시물을 무시하고 내 대답을 쓰는 동안 질문을 업데이트했습니다. 본인이 실제로이 수업에서 무엇을하려하는지 이해하지 못했습니다. 나는 그 목적에 대해 약간 혼란 스럽다. – Toby

답변

0

제네릭을 사용하여 직접 수행 할 수 없습니다. 일반 제약은 모든 구현에 대한 제약 조건 인 단일 유형을 지정해야합니다. 및 IEnumerable 이후 고유 기본 클래스 또는 인터페이스 인 System.String, IList<String>IList<OntologyStore>에 대한 공통 기본 클래스가 없습니다. 유일한 일반적인 기본 유형입니다 ...)

그러나 제네릭을 피하기 위해이 경우 제네릭을 피하는 것이 좋습니다. 나는 당신의 문제가 관련이있다 생각

public class Jim 
{ 
    protected Jim() {} 

    public Jim Create(string value) 
    { 
     return new StringJim(value); 
    } 

    private class StringJim : Jim 
    { 
     public StringJim(string value) { // ... 
     } 
    } 
    // Do same for IList<string> and IList<OntologyStore>.. 

    // Add common methods here... 
} 
1

위와 같은 클래스를 만들려고하지 말고 인터페이스 (또는 추상베이스)를 가지고 세 가지 구체적인 클래스를 파생시켜야하는 경우의 정의입니다.

1

을 : 기본 클래스를 만들고, 어떤 구조 3 개 팩토리 메소드를 가지고 문제의 특정 유형에 대한 서브 클래스를 반환하는 것입니다 기능 중복을 방지하기 위해

하나 개의 옵션 String 클래스에는 "new()"제약 조건에 필요한 public 매개 변수가없는 생성자가 없습니다.

0

일반 클래스를 작성하고 T 유형에 따라 작업을 수행하는 경우 일반적으로 제네릭에 적합하지 않거나 올바르게 클래스를 구성하지 못한다는 신호입니다.

이 경우 인터페이스를 사용하여 클래스에 공유 유형을 제공하는 것이 더 적합 할 것으로 보입니다. 그들이 어떤 종류의 구현을 공유하게된다면, 인터페이스 대신 기본 클래스를 사용하십시오.

관련 문제