具有通用构造函数的通用类?

5

我有一个通用类。构造函数需要接受另一个同类实例的参数。问题在于,另一个实例可能具有不同的泛型类型。

看起来C#允许我拥有一个具有自己泛型类型的方法,但是这似乎不允许在构造函数中使用。

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

    // ... Additional stuff
}

上面的代码告诉我T2未定义。它不接受它作为方法类型。
一种方法是在我的类中添加第二个泛型类型。但这很笨拙,在许多情况下,参数将是null,并且没有类型。
有人看到简单的解决方法吗?

2
也许是 public class MyClass<T, T2> - Slai
你创建这个类是想要做什么? - jdphenix
@Slai 我也在考虑这个问题,但是那会导致一个我似乎无法摆脱的循环。哈哈 - Nkosi
1
@jdphenix:抱歉,我不认为那有什么关联。我对编程并不陌生,我可以用一百种方法来写这个程序。但是我最想用的方式需要我在问题中描述的技巧。 - Jonathan Wood
3
好的,我会尽力进行翻译,让内容更加通俗易懂,但不会改变原意。下面是需要翻译的内容:好的,那么我真的看不出你的问题不是 XY 问题。同时,我也不确定我的问题与你实现任何事情的经验或熟悉程度有何关系。 - jdphenix
@jdphenix:根据您在XY问题评论中的进一步说明,您似乎认为我走错了方向。这表明您认为我缺乏知识和/或经验。如果我能采取这种方法来解决任何问题,那么它将简化我的解决方案。但是,如果没有某些扭曲,语言似乎不支持这种方法。如果您认为我正在做的事情的描述实际上是相关的,请分享它是如何相关的。 - Jonathan Wood
2个回答

5

不允许使用通用构造函数。但是,您可以使用通用工厂方法。

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的通用成员时,才能实现此操作。如果需要,请通过非泛型接口或基类进行抽象。


这会导致错误:public static MyClass<T> Create<T2>(int id, MyClass<T2> parent = null) - Ali Karaca
@AliKaraca:它给你什么错误?对我来说它是可以工作的:https://ideone.com/KQOuMb - Douglas

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接