C # наследование абстрактных классов - PullRequest
2 голосов
/ 18 октября 2011

хей, ребята,

Я пытаюсь решить эту домашнюю работу.Я зашел в тупик и ищу человека, который мог бы помочь с этой проблемой.

Это задача, которую я пытаюсь решить:

Работа 2: Абстрактный классне полный класс, он пропускает некоторые части, и вы не можете создавать объекты из него.Программист, который пишет производные классы, должен заполнить недостающие части.Рассмотрим абстрактный класс Vehicle.Выведите две иерархии из этого класса, как показано ниже: Теперь напишите 4 класса, увидите желтый прямоугольник.Начните с абстрактного базового класса Vehicle -> Vehicle с 4 колесами -> Sport Cars и остановитесь на производном классе Rally, который является наиболее конкретным классом.Класс 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();

}
}

Автомобиль класса 4 Колеса:

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.");
    }
}
}

Класс 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());


}
}
}

Я не уверен, ясно ли я понимаю задачу и с кодом, который у меня есть, я не знаюесли я на правильном пути, чтобы это произошло.Я не очень понимаю абстрактные классы и наследование.

Спасибо за вашу помощь!

V.

РЕДАКТИРОВАТЬ: Мой вопрос: Как я могу изменить код, который у меня есть?написано для выполнения задачи, которую мне дали?Потому что я не уверен, как быть общим при написании кода.Когда я добавляю атрибут car в класс Vehicle4Wheels, например:

private double carWeight;

Как я могу приблизиться к этому атрибуту в последующих производных классах?

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Некоторые из этих значений (самая высокая скорость, carWeight и т. Д.) Могут применяться к любому «Транспортному средству с 4 колесами» (или даже «транспортному средству»), поэтому вы можете определить свойства для этих значений на that level.

В конструкторе (производного класса) вы затем можете указать значения для этих свойств.

Затем метод Display может прочитать эти свойства, поэтому вы не сможетедаже не нужно переопределять этот метод на более высоких уровнях.

См. также http://msdn.microsoft.com/en-us/library/ms173115.aspx, о конструкторах и о том, как можно вызвать конструктор базового класса из конструктора производного класса.

1 голос
/ 18 октября 2011

Я не уверен, ясно ли я понимаю задачу, и с тем кодом, который у меня есть, я не знаю, нахожусь ли я на правильном пути, чтобы это произошло

Итак,давайте посмотрим, что у вас есть ...

Когда я добавляю атрибут car в класс Vehicle4Wheels, например:
private double carWeight;
Как мне затем подойти к этому атрибуту впотом производные классы?

Ваше домашнее задание не говорило вам об этом беспокоиться.

"У последнего производного класса есть частные поля для хранения мощности двигателя,вес автомобиля, ускорение автомобиля, максимальная скорость и функция, которая вычисляет удельную мощность (мощность / вес) "

Вы уже реализовали это довольно хорошо.Вот часть, которую вам не хватает:

"Проверьте свою работу в консольном приложении, использующем объекты типа классов Спортивный автомобиль и Ралли."

Один разВы реализовали это, вы поймете смысл всего написанного вами кода.

Чтобы сделать его интересным, и чтобы вы поняли смысл упражнения, убедитесь, что ваше консольное приложение выполняет что-то вродеэто:

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

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

Обратите внимание, я не сказал Rally rally = new Rally();

Также обратите внимание, что Vehicle something = new SportsCar(); работает.Попробуйте добавить строку: Vehicle something = new Vehicle(); - он не скомпилируется.

Все это продемонстрирует некоторые из наиболее важных частей наследования и (абстрактные) базовые типы:

  • Youможет взаимодействовать с базовым типом и получать производное поведение
  • Вы не можете создавать экземпляры абстрактных типов напрямую, но вы все равно можете использовать эти типы в своем коде

Попробуйте все это ипосмотрим, что получится.

...