扩展基类字段功能

时间:2011-06-04 18:18:30

标签: c# class inheritance derived-class

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

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

问题是,我想在使用MineNodeSource属性时访问Target提供的其他数据,但我只能访问Node个字段,因为它们已声明在基类:

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

访问FanPressure的唯一方法是将Source投射到MineNode,但代码会变得丑陋。

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

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

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

感谢。

2 个答案:

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