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

标签 c# polymorphism

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

相关文章:

c# - 使用接口(interface)和通用约束进行类型推断

java - 使用 super 作为引用类型时无法访问子类中的方法

c++ - 附加到 C++ 中的多态列表?

java - 接受包含特定方法的对象而不是接受特定类型

C++ 多态性 : return type of a virtual method

c# - 从类文件访问母版页属性

c# - 预生成 Entity Framework View

C++ 设计和多态性

c# - 使用 C# 在 Skype 上错过聊天

c# - 如何为我的服务层设计更灵活的结构