【问题标题】:C# overriding a method with different parametersC#用不同的参数覆盖一个方法
【发布时间】:2023-03-12 17:31:01
【问题描述】:

我正在处理一项涉及继承和覆盖方法的任务。我应该创建一个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();
    }
}

【问题讨论】:

  • 您不能“覆盖”方法并更改参数类型。时期。由于您选择调用接受两个字符串的方法,因此编译代码的方法是删除 override 关键字。不清楚您期望在这里发生什么,因为您似乎想以任何一种方式调用基类方法,因为这是这里唯一接受两个字符串的方法。除了“它没有做我想要的”之外,你能解释一下你想要发生的事情吗?
  • “CruiseShip 子类是类似的,只是 而不是 是构建日期的成员变量,它的最大乘客容量是一个整数值。”那是0意义。我只能假设你完全看错了作业。没有其他方法可以解释这一点。 “打印”听起来像“ToString()”方法。正常过载。
  • 当然,让我尝试详细说明。基于其他cmets,我不确定成员变量是什么,或者如何使用它。我应该有一个使用这些成员变量来显示数据的Print 方法。我想要一个 Ship 类,它有一个成员变量作为其名称和日期,以及一个使用名称和日期变量的 Print 方法。然后我想要一个 CruiseShip 子类,它有一个容量成员变量和一个 Print 方法,它覆盖了父类中只打印船名和容量的方法。
  • 你可以拥有所有这些,除了你不能改变你覆盖的方法的参数类型。方法需要参数吗?如果要让一个实例打印自己,不应该所有打印的数据都来自对象本身吗?

标签: c# class inheritance overriding subclass


【解决方案1】:

您遇到的问题是您正在创建无状态类,这本质上是您在本次作业中不应该做的事情。

想象一下我创造了你的一艘船:

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

太棒了!现在我们确实拥有了一艘有趣的船;它有一个名称和一个日期。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 也许我不清楚成员变量到底是什么。它是否像普通变量一样定义?它的值是如何传递给方法的?
    • 一个类由数据和行为(方法)组成。您将类中的数据(成员变量)声明为例如公共字符串 ShipName { 获取;放; }。类的方法可以访问这些。
    • @ZL4892 是的,您肯定不知道成员变量是什么。这是一个变量,它是类主体的一部分。也称为字段。
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2011-04-22
    • 2021-03-05
    • 2012-02-13
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多