如何在不了解实现的情况下在抽象类中创建对象?

时间:2010-05-11 01:10:33

标签: c# .net generics abstract-class

有没有办法在我的库摘要中实现“CreateNode”方法?或者这只能在库外的客户端代码中完成吗?我当前得到错误“无法创建抽象类或接口的实例'ToplogyLibrary.AbstractNode”

public abstract class AbstractTopology<T>
{
    // Properties
    public Dictionary<T, AbstractNode<T>> Nodes { get; private set; }
    public List<AbstractRelationship<T>> Relationships { get; private set; }

    // Constructors
    protected AbstractTopology()
    {
        Nodes = new Dictionary<T, AbstractNode<T>>();
    }

    // Methods
    public AbstractNode<T> CreateNode()
    {
        var node = new AbstractNode<T>();  // ** Does not work **
        Nodes.Add(node.Key, node);
        }
    }
 }

    public abstract class AbstractNode<T>
    {
        public T Key { get; set; }
    }

    public abstract class AbstractRelationship<T>
    {
        public AbstractNode<T> Parent { get; set; }
        public AbstractNode<T> Child { get; set; }

    }

3 个答案:

答案 0 :(得分:3)

您无法创建抽象类的实例,这就是您收到错误的原因。

您可以做的是将CreateNode声明为抽象方法,并在任何后代类中实现它。

答案 1 :(得分:2)

您要创建哪些具体的节点类?这可能是应该留给具体拓扑类的东西吗?如果是这样,你可能想把它变成抽象的:

public abstract AbstractNode<T> CreateNode();

然后在具体拓扑类中提供具体实现。

或者,您也可以在节点类型中使您的类通用:

public abstract class AbstractTopology<TValue, TNode>
    where TNode : AbstractNode<TValue>, new()

然后你可以像这样实现CreateNode:

public AbstractNode<T> CreateNode()
{
    var node = new TNode();
    Nodes.Add(node.Key, node);
    return node;   
}

我个人对涉及这么多抽象类的设计有点怀疑,但也许你有很好的理由。

答案 2 :(得分:0)

定义一个受保护的纯抽象虚方法,CreateNode将调用该子类返回一个新对象

CreateNodeImpl或其他东西。