我想创建一个只有两个字段的父类(super class):Id 和 Timestamp,并且有一个可以使用该父类(super class)的任何后代的类。有点像使用泛型,但我知道它至少会有一个 Id 和时间戳字段。
我可以使用反射来查找属性,但我将使用它一次处理数千个对象,并且我的印象是我会受到很大的性能影响(如果我是,请纠正我错误)。
这是我想做的一个简单、愚蠢的例子。假设我有以下父类(super class):
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
,它实际上调用 Type 参数“Shape”。
你要做的是:
public class ShapeHandler<T> where T: Shape
{
private T MyShape;
public double GetArea()
{
return MyShape.Area;
}
}
这意味着您的 ShapeHandler
只能用 Shape
的类型 (T
)(或继承自 的东西)实例化形状
)
要问自己的一件事是:
为什么需要这个?
当您只能使用 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);
}
我做了一个 fiddle 来演示here
关于c# - 访问父类(super class)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51049812/