代码之家  ›  专栏  ›  技术社区  ›  Slothario

访问超类成员

  •  1
  • Slothario  · 技术社区  · 6 年前

    我想创建一个只有两个字段的超类:id和timestamp,并且有一个类可以使用该超类的任何后代。有点像使用泛型,但我知道它至少有一个ID和时间戳字段。

    我可以使用反射来查找属性,但我将使用反射一次处理数千个对象,并且我觉得我将受到一个大的性能冲击(如果我错了,请纠正我)。

    下面是一个简单、愚蠢的例子,说明我想做什么。假设我有以下超类:

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

    我还实现了正方形,它从形状下降:

    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 回复  |  直到 6 年前
        1
  •  3
  •   maccettura    6 年前

    您的通用语法错误:

    class ShapeHandler<Shape> 
    

    正在使您 ShapeHandler 一般,但不限于 Shape ,它实际调用类型参数“shape”。

    你想做的是:

    public class ShapeHandler<T> where T: Shape
    {
        private T MyShape;
    
        public double GetArea()
        {
            return MyShape.Area;
        }
    }
    

    这意味着你的 形状处理程序 只能用类型实例化( T )的 形状 (或继承自 形状 )

    问自己一件事是:

    你为什么需要这个?

    当您只能使用类型的参数时,使用泛型是否有意义? 形状 是吗?

    基于您对记录某些属性的编辑,请考虑:

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

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

    你想打印出面积属性(它们在技术上都是 形状 所以他们都有 Area 属性。您可以创建一个接受 形状 参数,然后可以访问形状具有的任何内容:

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

    我做了个小提琴来演示 here

        2
  •  1
  •   BradleyDotNET Aniss    6 年前

    这不是 Shape 你在找。

    class ShapeHandler<Shape>
    {
        private Shape MyShape;
    

    这个 形状 在这段话里 这个 形状 类,它是泛型类型参数 打电话 形状 .就所有的意图和目的而言,如文中所述,它是 object .

    如果你真的想 ShapeHandler 要成为通用的,通常需要做一个接口( IShape )以及一个泛型类型约束:

    class ShapeHandler<T> where T : IShape
    

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

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

    还有一件事, MyShape 是代码中的一个字段,camelcase也是如此( myShape )