c# - 如何创建类的(多态性)集合/列表/数组,其中每个类都可能具有一些不同的属性

标签 c# inheritance unity3d polymorphism abstract

如果我想为游戏创建汽车引擎设计,我将执行以下操作:

基类:

public class EngineParts {
        public string name;
        public int ID; 
        public GameObject Mesh; 
        public Vector3 Position; 
        public Quaternion Rotation; 
        public string Description;
        public float new_value; // the brand new price of it
}

然后我将拥有从它继承的类:

public class Rods : EngineParts
    {    
    }

public class Pistons : EngineParts
    {
        public float Size=51;
        public float Compression=51;
    }

public class Turbo : EngineParts
    {
        public float maxboostpressure;
        public float minboostpressure;
        public float MaxOperatingRPM;
        public float MinOperatingRPM;
        public float AirToEngineRatio;
        public float wasteGatePressure;
    }

这里重要的是所有汽车零件共享一些Base类中的公共(public)值,这些值是名称、ID、网格、位置、旋转等

它们还有其他更具体的零件本身的值,例如 Turbo 有 maxboostpressure,它决定了涡轮可以处理的最大增压压力。

现在在实际游戏中我需要能够将零件作为一个集合来使用

public EngineParts[] Part = new EngineParts[3];

Part[0] = new Rods();
Part[1] = new Pistons();
Part[2] = new Turbo();

因此,我可以在需要时遍历所有零件,因为它们都是 EngineParts 类型。

但是当尝试为最大 maxboostpressure 赋值时,我无法做到这一点。

   //Note: Part[1] here is pistons
    Part[1].name = "SportPiston"; // this will work since it is type of EngineParts
    Part[1].maxboostpressure = 5.0; // this will not work

这是因为它的类型是 EngineParts

不过我可以说:

Rods rd = new Rods();
Pistons pt = new Pistons();
Turbo tb = new Turbo();

pt.name = 5; // this will work
pt.maxboostpressure = 5; // this will work

现在它们确实共享来自 Base 类的相同数据,但我不能将 Rods、Pistons、Turbo 放在一个集合中以循环遍历或将它们传递到一个适用于所有它们的函数中。

所以

这里是问题

我怎样才能最好地做到这一点?
1- 将引擎的所有部件放在一个集合/列表中
2- 能够以最少的编码在每种类型的零件上存储额外的数据。

我一直在阅读
抽象类、重载、多态性和继承来解决这个问题,但仍然有一些我必须想念的东西,所以如果有人能指出我正确的方向,我将不胜感激。

提前致谢

最佳答案

尝试这样的转换:

Piston p = Part[1] as Piston;

如果 Part[1] 不是活塞,则 p 将为 null。

然后继续

if(p!=null)
    doSomethingHere;

关于c# - 如何创建类的(多态性)集合/列表/数组,其中每个类都可能具有一些不同的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33387238/

相关文章:

c# - COM1 打开后如何关闭?

c# - Azure 移动服务 Tablecontroller updateAsync 最终出现内存不足异常

c++ - 重载运算符 & 继承 & 模板(一个强大的组合)

c# - 我如何在 unity3d 中使用 minijson 打印键和值

c# - 如何从 unity C# 访问自定义 C 类型定义、枚举?

c# - 引用类型相等

c# - 跨平台解决方案中哪些项目需要引用 .Net 标准库

c# - ExtractAssociatedIcon 返回 null

java - 在 JPA 中使用继承来实现数据类型目的

android - 统一安卓 : How to preload scenes in cache