2016-08-28 16 views
3

私はジェネリッククラスを持っています。コンストラクタは、同じクラスの別のインスタンスである引数を受け入れる必要があります。問題は、他のインスタンスが異なるジェネリック型を持つ可能性があることです。汎用コンストラクタを持つ汎用クラスですか?

C#のように見えますが、それは独自のジェネリック型のメソッドを持つことができますが、これはコンストラクタには許可されていません。

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

    // ... Additional stuff 
} 

上記コードは、T2が未定義であることを示しています。メソッド型としては受け付けません。

私のクラスに第2のジェネリック型を追加する方法があります。しかし、これは厄介なことであり、多くの場合、引数は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 
} 

サンプル使用:あなたはファクトリメソッドの外parentのいずれかの一般的なメンバーにアクセスする必要がない場合は

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

にのみ可能です。そうするなら、非ジェネリックインターフェースやベースクラスを使って抽象化する方が良いでしょう。

関連する問題