我有下一个代表图形边缘和节点的代码(简化问题):
public class Node
{
}
public class Edge
{
public Node Source { get; set; }
public Node Target { get; set; }
}
现在我想扩展这些类来描述矿井拓扑:
public class MineNode : Node
{
public double FanPressure { get; set; }
}
public class MineTunnel : Edge
{
public double Length { get; set; }
public double CrossSectionArea { get; set; }
public MineTunnel()
{
Source = new MineNode();
Target = new MineNode();
}
}
问题是,我想在使用MineNode
和Source
属性时访问Target
提供的其他数据,但我只能访问Node
个字段,因为它们已声明在基类:
MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); //Error
访问FanPressure
的唯一方法是将Source
投射到MineNode
,但代码会变得丑陋。
Console.WriteLine(((MineNode)t.Source).FanPressure); //OK
另一种方式可能是在基类声明中以某种方式使用泛型。但我不确定在我的情况下这是一个好习惯。
那么,我该如何解决这个问题 - 扩展基类字段的功能呢?
感谢。
答案 0 :(得分:6)
您可以将Edge
类型定义为通用类型,并带有约束:
public class Edge<TNode> where TNode: Node
{
public TNode Source { get; set; }
public TNode Target { get; set; }
}
您可以通过它将MineTunnel
类型重新定义为:
public class MineTunnel : Edge<MineNode>
{
// Stuff
}
答案 1 :(得分:1)
我认为仿制药就是去这里的方式......
试试这个:
public class Node
{
}
public class Edge<S, T>
where S : Node
where T : Node
{
public S Source { get; set; }
public T Target { get; set; }
}
然后,您可以使用以下命令扩展Node和Edge类:
public class MineNode : Node
{
public double FanPressure { get; set; }
}
public class MineTunnel : Edge<MineNode, MineNode>
{
public double Length { get; set; }
public double CrossSectionArea { get; set; }
public MineTunnel()
{
Source = new MineNode();
Target = new MineNode();
}
}
如果错误或不起作用,请纠正我......:)
MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); // Now this works without errors ;)