[英]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.