簡體   English   中英

如何使此代碼更通用

[英]How can I make this code more generic

從庫用戶想要實現的方式來看,在字典鍵可以是不同類型的意義上,如何使該代碼更通用? 例如,在存在可以說Node的“唯一鍵”實際上是“ int”而不是“ string”的情況下,某人可能會使用擴展方法/接口。

public interface ITopology
{
    Dictionary<string, INode> Nodes { get; set; } 
}

public static class TopologyExtns
{
    public static void AddNode(this ITopology topIf, INode node)
    {
        topIf.Nodes.Add(node.Name, node);
    }
    public static INode FindNode(this ITopology topIf, string searchStr)
    {
        return topIf.Nodes[searchStr];
    }
}

public class TopologyImp : ITopology
{
    public Dictionary<string, INode> Nodes { get; set; }

    public TopologyImp()
    {
        Nodes = new Dictionary<string, INode>();
    }
}

使接口通用,然后將Func<INode,T>用作鍵的選擇器。 這假定您要從節點中提取字典的鍵。 如果這不是硬性要求,則可以使用簽名中的通用類型說明符來指定密鑰本身。

public interface ITopology<T>
{ 
    Dictionary<T, INode> Nodes { get; set; }  
} 

public static class TopologyExtns 
{ 
    public static void AddNode<T>(this ITopology<T> topIf, INode node, Func<INode,T> keySelector ) 
    { 
        topIf.Nodes.Add( keySelector(node), node ); 
    } 
    public static INode FindNode<T>(this ITopology<T> topIf, T searchKey ) 
    { 
        return topIf.Nodes[searchKey]; 
    } 
} 

public class TopologyImp<T> : ITopology<T> 
{ 
    public Dictionary<T, INode> Nodes { get; set; } 

    public TopologyImp() 
    { 
        Nodes = new Dictionary<T, INode>(); 
    } 
}

您可能還考慮將INode設為通用類型。 這樣,您就可以將Key指定為通用類型的屬性,實現可以將其歸為適當的“真實”鍵。 這將使您不必為擴展方法提供鍵或選擇器。

選擇:

public interface INode<T>
{
     T Key { get; }
     string Name { get; set; }
     int ID { get; set; }
}

public class StringNode : INode<string>
{
    public string Key { get { return this.Name; } }
    public string Name { get; set; }
    public int ID { get; set; }
}

public interface ITopology<T> 
{  
    Dictionary<T, INode<T>> Nodes { get; set; }   
}  

public static class TopologyExtns  
{  
    public static void AddNode<T>(this ITopology<T> topIf, INode<T> node )  
    {  
        topIf.Nodes.Add( node.Key, node );  
    }  
    public static INode<T> FindNode<T>(this ITopology<T> topIf, T searchKey )  
    {  
        return topIf.Nodes[searchKey];  
    }  
}  

public class TopologyImp<T> : ITopology<T>  
{  
    public Dictionary<T, INode<T>> Nodes { get; set; }  

    public TopologyImp()  
    {  
        Nodes = new Dictionary<T, INode<T>>();  
    }  
}

用作:

var topology = new TopologyImp<string>();
topology.AddNode( new StringNode { Name = "A", ID = 0 }  );
var node = topology.FindNode( "A" );
public interface ITopology<T>
{
    Dictionary<T, INode> Nodes { get; set; } 
}

public static class TopologyExtns<T>
{
    public static void AddNode<T>(this ITopology<T> topIf, T key, INode node)
    {
        topIf.Nodes.Add(key, node);
    }
    public static INode FindNode<T>(this ITopology<T> topIf, T searchKey)
    {
        return topIf.Nodes[searchKey];
    }
}

public class TopologyImp<T> : ITopology<T>
{
    public Dictionary<T, INode> Nodes { get; set; }

    public TopologyImp()
    {
        Nodes = new Dictionary<T, INode>();
    }
}

為什么不使您的拓撲接口通用? 我自己對擴展方法有些模糊,但這應該是可行的。

public interface ITopology<TKey> 
{ 
    Dictionary<TKey, INode> Nodes { get; set; }  
} 

public static class TopologyExtns 
{ 
    public static void AddNode<T>(this ITopology<T> topIf, T key, INode node) 
    { 
        topIf.Nodes.Add(key, node); 
    } 
    public static INode FindNode<T>(this ITopology<T> topIf, T searchObj) 
    { 
        return topIf.Nodes[searchObj]; 
    } 
} 


public class TopologyImp : ITopology<String> 
{ 

public TopologyImp() 
{ 
    Nodes = new Dictionary<String, INode>(); 
} 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM