Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展基类字段功能_C#_Class_Inheritance_Derived Class - Fatal编程技术网

C# 扩展基类字段功能

C# 扩展基类字段功能,c#,class,inheritance,derived-class,C#,Class,Inheritance,Derived Class,下面是表示图边和节点的代码(问题简化): 现在我想扩展这些类来描述我的拓扑: public class MineNode : Node { public double FanPressure { get; set; } } public class MineTunnel : Edge { public double Length { get; set; } public double CrossSectionArea { get; set; } public

下面是表示图边和节点的代码(问题简化):

现在我想扩展这些类来描述我的拓扑:

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
提供的其他数据,但我只能访问
节点
字段,因为它们是在基类中声明的:

MineTunnel t = new MineTunnel();
Console.WriteLine(t.Source.FanPressure); //Error
访问
fanpression
的唯一方法是将
Source
投射到
MineNode
上,但这样代码会变得丑陋

Console.WriteLine(((MineNode)t.Source).FanPressure); //OK
另一种方法是在基类声明中使用泛型。但我不确定在我的情况下这是否是一个好的做法

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


谢谢。

我认为仿制药是这里的发展方向

试试这个:

public class Node
{

}

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

您可以将
Edge
类型定义为泛型,并带有以下约束:

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

为什么有边缘扩展节点?哦,对不起,这不是故意的。我想在我写类头的时候,它滑到了那里。为什么源节点和目标节点有不同的类型?因为我认为边缘可能从MineNode到YourNode。您可以为源和目标指定不同的类型。不同的泛型类型可以,但我将始终使用相同的类型。所有的答案都是正确的,但是你的速度快了一点。
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 ;)
public class Edge<TNode> where TNode: Node
{
  public TNode Source { get; set; }
  public TNode Target { get; set; }
}
public class MineTunnel : Edge<MineNode>
{
  // Stuff
}