gpt4 book ai didi

c# - 访问父类(super class)成员

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:27 24 4
gpt4 key购买 nike

我想创建一个只有两个字段的父类(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com