2016-08-28 7 views
3

일반 클래스가 있습니다. 생성자는 동일한 클래스의 다른 인스턴스 인 인수를 허용해야합니다. 문제는 다른 인스턴스가 다른 제네릭 형식을 가질 수 있다는 것입니다.일반 생성자가있는 일반 클래스?

C#처럼 보이는 제네릭 형식의 메서드를 가질 수 있지만이 생성자에 대해 허용 된 나타나지 않습니다.

public class MyClass<T> 
{ 
    public MyClass<T2>(MyClass<T2> parent = null) 
    { 
    } 

    // ... Additional stuff 
} 

위의 코드는 T2이 정의되지 않았 음을 알려줍니다. 메소드 유형으로 채택하지 않습니다.

한 가지 방법은 내 클래스에 두 번째 제네릭 형식을 추가하는 것입니다. 그러나 이것은 어색하며 대부분의 경우 인수는 null이며 형식이 없습니다.

누구든지이 문제를 해결하는 간단한 방법을 알고 있습니까?

+2

아마도 'public class MyClass ' – Slai

+0

이 클래스를 만들어서 무엇을하려고합니까? – jdphenix

+0

@Slai 나는 또한 그렇게 생각하고 있었지만 그 사이클로 이어질 수는 없었다. lol – Nkosi

답변

4

정확합니다. 일반 생성자는 지원되지 않습니다.

당신은 아마 시도 할 수 다음

는 낮은 수준의 공통 인터페이스

public interface IMyClass { 
    //...some common stuff 
    IMyClass Parent { get; set; } 
} 

를 만들고 사용하는

public class MyClass<T> : IMyClass { 
    public MyClass(IMyClass parent = null) { 
     Parent = parent; 
    } 
    public IMyClass Parent { get; set; }  
    // ... Additional stuff 
} 
4

일반 생성자가없는 유형 사이의 일반적인 링크로 허용. 그러나 대신 일반 팩토리 메서드를 사용할 수 있습니다.

public class MyClass<T> 
{ 
    public int Id { get; private set; } 
    public int? ParentId { get; private set; } 

    public static MyClass<T> Create(int id) 
    { 
     return Create<object>(id, null); 
    } 

    public static MyClass<T> Create<T2>(int id, MyClass<T2> parent = null) 
    { 
     var current = new MyClass<T>(); 
     current.Id = id; 
     current.ParentId = parent?.Id; 
     return current; 
    } 

    private MyClass() 
    { 
    } 

    // ... Additional stuff 
} 

샘플 사용 :이에만 가능

var intClass = MyClass<int>.Create(55); 
var charClass = MyClass<char>.Create(234, intClass); 
// charClass.ParentId is 55 

당신은 팩토리 메소드 외부 parent의 일반적인 멤버에 액세스 할 필요가없는 경우. 그렇다면 비 제네릭 인터페이스 또는 기본 클래스를 통해 추상화하는 것이 좋습니다.