C#抽象类继承

时间:2011-10-18 08:56:27

标签: c# inheritance abstract-class

伙计们,

我正在努力解决这项功课。我已经走到了尽头,我正在寻找可以帮助解决这个问题的人。

这是我要解决的任务:

  

工作2:抽象类不是一个完整的类,它错过了一些   零件,你不能从它创建对象。程序员谁   编写派生类必须填写缺少的部分。考虑   一个抽象类车辆。从此类派生两个层次结构   如下所示:现在,写4个类,看黄色矩形。   从抽象基类Vehicle - >开始车轮有4个轮子    - >跑车和派对级拉力赛,这是最具体的类。 Vehicle类包含一个字段   保存车辆名称和抽象方法void Display()。

     

在派生类中实现此函数,以便该函数   返回有关车辆的信息,例如电机功率等   必要的属性。最后一个派生类具有私有字段   保持电机功率,汽车重量,汽车加速度,   最高速度和计算特定功率的功能(功率   /重量)。函数Display返回包含所有这些的文本字符串   信息。在使用的控制台应用程序中测试您的工作   运动车和拉力赛类型的物体。

类车辆:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A_work_2
{
public abstract class Vehicle
{
    public string vehicleName;
    public abstract void Display();

}
}

类Vehicle4Wheels:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A_work_2
{
public class Vehicle4Wheels : Vehicle
{
    public override void Display() 
    {
        Console.WriteLine("Car with four wheels.");
    }
}
}

Class SportCar:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A_work_2
{
public class SportCar : Vehicle4Wheels {
    public override void Display()
    {
        Console.WriteLine("Sport version of the car.");
    }
}
}

班级拉力赛:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace A_work_2
{
public class Rally : SportCar
{
private double motorPower = 408;
private double carWeight = 2380;
private double carAcceleration = 4.7;
private double highestSpeed = 250;

public double SpecificPower()
{
    double specificPower = motorPower / carWeight;
    return specificPower;
}

public override void Display()
{

   Console.WriteLine("The acceleration is: {0}.\nThe highest speed is {1} km/h.", carAcceleration, highestSpeed);
   Console.WriteLine("Specific power is {0}", SpecificPower());


}
}
}

我不确定我是否清楚地理解了这项任务,而且到目前为止,我还不知道我是否采取了正确的方法来实现这一目标。我非常不理解抽象类和无意义。

感谢您的帮助!

编辑:我的问题是:如何更改我编写的代码以完成我给出的任务?因为我不确定在编写代码时如何变通。当我将car属性添加到Vehicle4Wheels类时,如:

private double carWeight;

如何在以后的派生类中处理此属性?

2 个答案:

答案 0 :(得分:2)

其中一些值(highestSpeed,carWeight等)可以应用于任何“4轮车辆”(甚至是“车辆”),因此您可以在<? em>那级别。

在构造函数(派生类的构造函数)中,您可以为这些属性提供值。

然后,Display方法可以读取这些属性,因此您甚至不必在更高级别上覆盖该方法。

另请参阅http://msdn.microsoft.com/en-us/library/ms173115.aspx,关于构造函数以及如何从派生类的构造函数中调用基类的构造函数。

答案 1 :(得分:1)

  

我不确定我是否清楚地理解了这项任务,而且到目前为止,我还不知道我是否采取了正确的方式来实现这一目标

所以,让我们回顾一下你到目前为止所得到的......

  

当我将car属性添加到Vehicle4Wheels类时,如:
  私人双车重;
  那么我怎样才能在以后的派生类中处理这个属性呢?

你的家庭作业并没有让你担心。

  

“最后派生的类具有保持电机功率的私有字段,汽车重量,汽车加速度,最高速度以及计算特定功率(功率/重量)的功能”

你已经很好地实现了这一点。您缺少的部分是:

  

“在使用运动车和拉力赛类型对象的控制台应用程序中测试您的工作。”

一旦你实现了这一点,你就会理解你所写的所有代码的重点。

为了让它变得有趣,所以你得到了练习的重点,确保你的控制台应用程序做了这样的事情:

Vehicle sportCar = new SportCar();
sportCar.Display();

Vehicle rally = new Rally();
rally.Display();

注意我没有说Rally rally = new Rally();

另请注意Vehicle something = new SportsCar();有效。尝试添加一行:Vehicle something = new Vehicle(); - 它不会编译。

这一切都将展示继承和(抽象)基类型的一些最重要的部分:

  • 您可以与基本类型进行交互并获得派生行为
  • 您无法直接创建抽象类型的实例,但仍可以在代码中使用这些类型

尝试这一切,看看会发生什么。