访问超类成员

时间:2018-06-26 19:01:30

标签: c# polymorphism

我想创建一个只有两个字段的超类:Id和Timestamp,并具有一个可以使用该超类的任何后代的类。有点像使用泛型,但是我知道它将至少具有一个Id和timestamp字段。

我可以使用反射来查找属性,但是我将使用它来一次处理数千个对象,并且给人的印象是我会对性能产生重大影响(如果我想错误)。

这是我想要做的一个简单而愚蠢的例子。说我有以下超类:

public class Shape
{
    public double Area { get; set; }
}

我还实现了平方,它源自Shape:

class Square : Shape
{
    public int SideLength { get; set; }
    // more stuff
}

我要做的是制作一个ShapeHandler类,该类可以接受任何类型的形状并可以获取其面积。但是以下代码不正确

class ShapeHandler<Shape>
{
    private Shape MyShape;

    public double GetArea()
    {
        return MyShape.Area;
    }
}

我希望能够做到这一点:

var sh = new ShapeHandler<Square>();
sh.GetArea();

这个问题有意义吗?有做我想做的正确方法吗?

2 个答案:

答案 0 :(得分:3)

您的通用语法有误:

class ShapeHandler<Shape> 

正在使您的ShapeHandler成为通用类型,但它并不限于Shape,它实际上将Type参数称为“ Shape”。

您想要做的是:

public class ShapeHandler<T> where T: Shape
{
    private T MyShape;

    public double GetArea()
    {
        return MyShape.Area;
    }
}

这意味着您的ShapeHandler只能用T(或继承自Shape的某种类型(Shape)实例化

问自己一件事是:

为什么需要这个?

仅使用Shape类型的参数时使用泛型有意义吗?

根据您对记录某些属性的编辑,请考虑以下问题:

您有两个对象,一个形状和一个正方形:

var square = new Square() { Area = 4.0, SideLength = 2 };
var shape = new Shape() { Area = 3.0 };

您想打印出Area属性(从技术上来说,它们均为Shape,因此它们都具有Area属性。您可以创建一个接受Shape参数的方法,然后您可以访问Shape具有的任何内容:

public static void LogArea(Shape shape)
{
    Console.WriteLine(shape.Area);
}

我用小提琴来演示here

答案 1 :(得分:1)

这不是您要查找的Shape

class ShapeHandler<Shape>
{
    private Shape MyShape;

该代码段中的Shape不是Shape类,它是称为的通用类型参数 Shape。就所有意图和目的而言,其文字均为object

如果您确实希望ShapeHandler是通用的,则通常会做一个接口(IShape)和一个通用类型约束:

class ShapeHandler<T> where T : IShape

尽管约束也可以针对具体的类。但是,没有任何真正的理由让它成为通用的 ,只需接受/存储一个基类引用并称其为好。

 class ShapeHandler
  {
      public ShapeHandler(Shape shape)
      {
          MyShape = shape;
      }
  }

另一件事,MyShape是代码中的一个字段,因此应为camelCase(myShape