扩展基类字段功能
我有下一个代表图边和节点的代码(简化了问题):
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
另一种方法可能是在基类声明中使用某种泛型。但我不确定这对于我的情况来说是否是一个好的做法。
那么,我该如何解决这样的问题——扩展基类字段的功能呢?
谢谢。
I have next code that represents graph edges and nodes (simplified for question):
public class Node
{
}
public class Edge
{
public Node Source { get; set; }
public Node Target { get; set; }
}
Now I want to extend this classes for describing mine topology:
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();
}
}
The problem is that I want to access additional data provided by MineNode
when using Source
and Target
properties, but I can access only Node
fields because they are declared in base class:
MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); //Error
The only way to access FanPressure
is to cast Source
to MineNode
but code become ugly this way.
Console.WriteLine(((MineNode)t.Source).FanPressure); //OK
The another way is maybe to use somehow generics in base class declaration. But I'm not sure is that a good practice in my situation.
So, how can I solve such problem - extend functionality of base class fields?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以将
Edge
类型定义为通用类型,并带有约束:通过它您可以将
MineTunnel
类型重新定义为:You could define your
Edge
type as generic, with constraints:Through which you could redefine your
MineTunnel
type as:我认为泛型是这里的方法...
试试这个:
然后你可以扩展 Node 和 Edge 类:
如果这是错误的或不起作用,请纠正我...:)
I think generics is the way to go here...
Try this:
Then you can extend the Node and Edge classes with:
Please correct me if this is wrong or doesn't work... :)