2010-05-11 55 views
0

有沒有在我的庫摘要中實現「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; } 

    } 

回答

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; 
} 

個人而言,我會有點懷疑涉及設計這很多抽象類,但也許你有很好的理由。

+0

聽起來不錯。然而,使用該方法的調用者在使用mehod時是否必須通過該類型? – Greg 2010-05-11 01:33:29

3

不能創建一個抽象類,這就是爲什麼你收到錯誤的實例。

你可以做的是將CreateNode聲明爲抽象方法,並在任何後代類中實現它。

+0

當它,你有更快的手指。 – 2010-05-11 01:15:49

0

定義CreateNode將調用子類返回一個新的對象

CreateNodeImpl什麼保護的純抽象的虛方法。