C#覆盖具有不同参数的方法

时间:2018-11-10 21:14:52

标签: c# class inheritance override subclass

我正在处理一个涉及继承和覆盖方法的任务。我应该创建一个Ship类和一个CruiseShip子类。船舶类应该具有两个成员变量,一个用于船舶名称的字符串和一个用于船舶建造日期的字符串。该类还需要一种Print方法来显示该信息。

CruiseShip子类相似,不同之处在于,它要代替其生成日期的成员变量,而要为其最大乘客人数提供一个整数值。该子类应该重写Ship类的Print方法,并且仅显示船名和容量(而不是日期)。

下面我的代码的问题是,我不确定如何重写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 :(得分:2)

您遇到的问题是您正在创建无状态类,这实际上是您不应在此分配中执行的操作。

想象一下,我创造了您的其中一艘船:

var myShip = new Ship();

好的,那...这艘船有什么特别之处?我什么也没说...船上没有任何相关信息,它们都是一样的。您需要找到一种在船内实际存储信息的机制,又称为 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";

太好了!现在我们手里拿着一艘有趣的船。它有一个名称和一个 date

此外,现在虚拟方法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. 只读成员字段和属性以及不可变类型

答案 1 :(得分:0)

Print方法应从成员变量中获取数据,因此不需要任何参数