C # переопределение метода с различными параметрами - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю над заданием, которое включает методы наследования и переопределения. Я должен создать класс Ship и подкласс CruiseShip. Предполагается, что в классе корабля есть две переменные-члены: строка для названия корабля и строка для даты постройки корабля. Классу также нужен метод Print для отображения этой информации.

Подкласс CruiseShip аналогичен, за исключением того, что вместо переменной-члена для даты постройки он должен иметь целочисленное значение для максимальной вместимости пассажиров. Предполагается, что подкласс переопределяет метод Print класса Ship и отображает только название и вместимость корабля (но не дату).

Проблема с моим кодом ниже заключается в том, что я не уверен, как переопределить метод Print, чтобы получить строку и целое число вместо двух строк. Как можно, чтобы метод переопределения отображал соответствующую дату?

public class Ship
{
    public virtual void Print(string name, string date)
    {
        Console.WriteLine("The ship's name: {0}", name);
        Console.WriteLine("The ship's build date: {0}", date);
    }
}

public class CruiseShip : Ship
{
    public override void Print(string name, int capacity)
    {
        Console.WriteLine("The ship's name: {0}", name);
        Console.WriteLine("The ship's passanger capacity: {0}", capacity);
    }
}

public class SeeShips
{
    static void Main(string[] args)
    {
        Ship newShip = new Ship();
        newShip.Print("Generic Ship","1989");
        Console.ReadLine();
    }
}

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

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

Представьте, что я создаю один из ваших кораблей:

var myShip = new Ship();

Хорошо, отлично, так ... что особенного в этом корабле? Я бы ничего не сказал ... корабль не имеет никакой информации, они все одинаковы. Вам нужно найти механизм, который на самом деле хранит информацию внутри вашего корабля, AKA state :

public class Ship
{
    //these should be properties or
    //readonly variables but thats for later
    public string name; 
    public string date;
}

Хорошо, теперь вы можете создать Ship и придать ему некоторое состояние:

var myShip = new Ship();
myShip.name = "My Ship";
myShip.date = "Yesterday";

Отлично! Теперь у нас do есть интересный корабль в наших руках; у него есть имя и дата .

Более того, теперь виртуальному методу Print не нужна никакая информация, передаваемая ему (аргументы), потому что он может получить состояние с корабля, из которого вызывается метод:

public class Ship
{
     ....
     public virtual string Print() {
        Console.WriteLine("The ship's name: {0}", name);
        Console.WriteLine("The ship's build date: {0}", date); }

Вы видите, как это работает?

Отсюда вы сможете понять, как создать подкласс CruiseShip, переопределить Print и заставить его делать то, что вы хотите.

Предметы, о которых вы обязательно захотите прочитать:

  1. Конструкторы и исходное состояние
  2. Почему свойства вместо открытых полей
  3. Только для чтения элементы полей и свойства и неизменяемые типы
0 голосов
/ 11 ноября 2018

Методы Print должны получать свои данные из переменных-членов, поэтому параметры не требуются

...