如何实例化这个类?

4

考虑这个带泛型的声明:

public class BaseNode<TNode> where TNode : BaseNode<TNode>
{
    public class Node : BaseNode<Node>
    {
        public Node() { }
    }
}

有没有一种方法可以在基类外部创建Node类的实例?我以前使用过这种模式,但总是将派生类留在基类之外。

如何在没有编译器错误的情况下编写以下内容?

var obj = new BaseNode<Node>.Node(); 
// error CS0246: The type or namespace name 'Node' could not be found

我创建了一个无法实例化的类吗?它是否可以通过反射进行初始化?


5
为什么不将Node定义在BaseNode之外? - benjer3
我认为你要么必须在父类上创建一个构造函数并在那里实例化Node类,要么创建一个将实例化Node类的方法。 - Alex Mendez
这是一个学术问题。我只是出于美学原因创建了它,然后意识到我把钥匙放在了一个锁着的抽屉里。 - John Alexiou
2个回答

5
你可以实例化那个对象。你只需要创建一个继承自Node的类即可:
public class MyNode : BaseNode<MyNode>.Node
{
}

然后你可以按照以下方式实例化它:
BaseNode<MyNode> obj = new BaseNode<MyNode>();

然而,为什么您希望这样做是完全不同的问题...

1
+1 对于“为什么你想要这样做...”的支持(更不用说一种有效的实例化节点的方法了)。 - Mark Avenius

1
添加一个静态工厂方法:
public static Node Create<T>()
{
    return // your new Node
}

并将其称为这样:

var foo = BaseNode<Node>.Create<Node>();

你不能在没有类型参数的情况下调用var foo = BaseNode.Create<Node>(); - Mark Avenius
没有 BaseNode 类型,只有一个通用的 BaseNode<> 类型,除非您还建议他使其不通用。 - Steven Doggart
1
你仍然无法调用 BaseNode<Node>.Create(),因为 Node 不是已知类型。 - Mark Avenius
1
啊,真是一团糟。我想你需要一个静态的、非泛型的类来完成它。 - Robert Harvey
1
没错。同意。想要这样做的原因是一个更有趣的问题。 - Mark Avenius

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