扩展基类字段功能

发布于 2024-11-14 06:48:34 字数 1063 浏览 5 评论 0原文

我有下一个代表图边和节点的代码(简化了问题):

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 提供的附加数据SourceTarget 属性,但我只能访问 Node 字段,因为它们是在基类中声明的:

MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); //Error

访问 FanPressure 的唯一方法 是强制转换SourceMineNode 但这样代码会变得丑陋。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡莣 2024-11-21 06:48:35

您可以将 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
}

You could define your Edge type as generic, with constraints:

public class Edge<TNode> where TNode: Node
{
  public TNode Source { get; set; }
  public TNode Target { get; set; }
}

Through which you could redefine your MineTunnel type as:

public class MineTunnel : Edge<MineNode>
{
  // Stuff
}
初心 2024-11-21 06:48:35

我认为泛型是这里的方法...

试试这个:

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

I think generics is the way to go here...

Try this:

public class Node
{

}

public class Edge<S, T>
    where S : Node
    where T : Node
{
    public S Source { get; set; }
    public T Target { get; set; }
}

Then you can extend the Node and Edge classes with:

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

Please correct me if this is wrong or doesn't work... :)

MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); // Now this works without errors ;)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文