Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从超类C访问子类方法#_C#_Oop_Inheritance - Fatal编程技术网

C# 从超类C访问子类方法#

C# 从超类C访问子类方法#,c#,oop,inheritance,C#,Oop,Inheritance,所以我知道我不能从父类访问子类的方法和属性。 但我有一个程序,它将车辆存储在一个数组中(不是arraylist,而是它的家庭作业)。 然后,车辆初始化为飞机、船或从车辆类派生的汽车对象。 这些子类具有独特的属性,我想知道如何访问这些属性 以下是一些(简化的)相关代码: Vehicle[] vehicles = new Vehicle[20]; vehicles[0] = new Airplane(); // Setting an attribute of the superclass veh

所以我知道我不能从父类访问子类的方法和属性。 但我有一个程序,它将车辆存储在一个数组中(不是arraylist,而是它的家庭作业)。 然后,车辆初始化为飞机、船或从车辆类派生的汽车对象。 这些子类具有独特的属性,我想知道如何访问这些属性

以下是一些(简化的)相关代码:

Vehicle[] vehicles = new Vehicle[20];

vehicles[0] = new Airplane();

// Setting an attribute of the superclass
vehicles[0].Make = "Boeing";

// Set an attribute from the Airplane class
vehicles[0].Engine = "Jet"; //(obviously this doesn't work)
我怎样才能解决这个问题呢?我已经研究了几个小时,但我被这个问题难住了


谢谢:)

演员阵容解决了我的问题:

((Airplane)vehicles[currentItem]).EngineType = "Jet";

// Rather than

vehicles[currentItem].EngineType = "Jet";

您可以通过引用声明的类型来访问引用。由于您将数组声明为
车辆
,因此无法直接访问子类成员

为此,请分别从包含该对象的集合中初始化该对象:

var jet = new Airplane();
jet.Make = "Boeing";
jet.Engine = "Jet";

vehicles[0] = jet;
或者,使用对象初始值设定项:

vehicles[0] = new Airplane
{
    Make = "Boeing",
    Engine = "Jet"
};
在实例化它之后将其抛出是非常荒谬的,但您也可以这样做:

vehicles[0] = new Airplane();
((Airplane)vehicles[0]).Make = "Boeing";
((Airplane)vehicles[0]).Engine = "Jet";

((飞机)车辆[0]).Engine=“Jet”
?您可以使用使其工作。您必须将对象强制转换为其真实类型,然后才能访问它。假设你知道这个类型。如果你只是将它们添加到一个乱七八糟的piggledy数组中,那么当你把它变成一辆汽车时,你实际上是在扔掉这些信息。我猜当你再次访问它时,你不可能知道原始类型是什么。如果你给我们一些关于你的代码的总体目标是什么的上下文,也许我们可以帮助你做得更好。谢谢!!是的,我知道哪个元素是什么类型的,所以铸造就是答案。我的天哪,它是如此简单(交通工具[0]就像飞机)但是如果你知道它是一架飞机,为什么你把它当作一辆交通工具呢?不知道你的意思,但简单地说,铸造是解决我问题的方法。在我发帖之前,我不想用物体来投射。该程序所做的只是将车辆存储在列表框中。这在某种程度上是错误的吗?您的代码假设具有给定索引的车辆是飞机。如果您知道这一点,为什么要使用Vehicle[]数组而不是Planet[]数组?如果不知道或不关心更派生的类型,则通常使用父类的集合。当
vehicles[currentItem]
不是飞机时,强制转换将引发异常。我实际上不知道代码中的对象,因为我使用for循环遍历vehicles[]数组,然后使用if语句测试typeof。根据类型,它打印一条显示车辆详细信息的消息,这些是子类的私有属性。谢谢你的帮助,但那是一种设计的味道。如果希望收集车辆,那么这样做是因为希望对所有车辆一视同仁。一种解决方案是为Vehicle基类提供一个
公共抽象void PrintDetails()
,然后可以在派生类中实现并调用基类。