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

C# overriding a method with different parameters

我正在处理一项涉及继承和覆盖方法的作业。我应该创建一个 Ship class 和一个 CruiseShip subclass。船 class 应该有两个成员变量,一个是船名字符串,一个是船建造日期字符串。 class 还需要一个 Print 方法来显示该信息。

CruiseShip subclass 类似,只是它不是构建日期的成员变量,而是具有最大乘客容量的整数值。 subclass 应该覆盖 Ship class 的 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();
    }
}

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

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

假设我创造了你的一艘船:

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";

太棒了!现在我们手上有了一艘有趣的船;它有一个 name 和一个 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. 为什么属性而不​​是 public 成员字段
  3. 只读成员字段和属性以及不可变类型