2016-08-28 3 views
3

У меня есть общий класс. Конструктор должен принять аргумент, являющийся другим экземпляром того же класса. Проблема в том, что другой экземпляр может иметь другой тип генериков.Общий класс с универсальным конструктором?

Похоже, что C# позволяет мне иметь метод с его собственным типом generics, но это не представляется допустимым для конструктора.

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

    // ... Additional stuff 
} 

Код выше говорит мне T2 не определено. Он не принимает его как тип метода.

Один из подходов состоит в том, чтобы добавить к моему классу второй тип общего типа. Но это неудобно, и во многих случаях аргумент будет null и нет типа.

Кто-нибудь видит простой способ обойти это?

+2

возможно 'public class MyClass ' – Slai

+0

Что вы пытаетесь сделать, создав этот класс? – jdphenix

+0

@ Слай Я тоже думал об этом, но это привело к циклу, от которого я не мог вырваться. 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

Generic Конструкторы не являются позволил. Однако вместо этого вы можете использовать общий заводский метод.

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 вне фабричного метода. Если вы это сделаете, вам лучше абстрагировать его через не общий интерфейс или базовый класс.