扩展基类字段功能

本文关键字:功能 字段 基类 扩展 | 更新日期: 2023-09-27 17:58:27

我有下一个代码来表示图的边和节点(为解决问题而简化):

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

问题是,当使用SourceTarget属性时,我想访问MineNode提供的额外数据,但我只能访问Node字段,因为它们是在基类中声明的

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

访问FanPressure的唯一方法是将Source强制转换为MineNode,但这样代码会变得很难看。

Console.WriteLine(((MineNode)t.Source).FanPressure); //OK

另一种方法可能是在基类声明中以某种方式使用泛型。但我不确定在我的情况下这是否是一个好的做法。

那个么,我该如何解决这样的问题——扩展基类字段的功能呢?

谢谢。

扩展基类字段功能

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

我认为泛型是实现这一目标的方法。。。

试试这个:

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