访问超类成员



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

我可以使用反射来查找属性,但我将使用它一次处理数千个对象,并且我的印象是我会受到很大的性能影响(如果我错了,请纠正我(。

这里有一个简单而愚蠢的例子来说明我想做的事情。 假设我有以下超类:

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

我还实现了 square,它源自 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();

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

你的通用语法有误:

class ShapeHandler<Shape> 

正在使您的ShapeHandler通用,但它不仅限于Shape,它实际上调用类型参数"形状"。

您要做的是:

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

这意味着您的ShapeHandler只能使用Shape的类型(T(实例化(或继承自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);
}

我做了一个小提琴在这里演示

这不是您要查找的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是代码中的一个字段,所以应该是驼峰大小写 (myShape(

最新更新