有没有办法在我的库摘要中实现“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; }
}
答案 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或其他东西。