簡體   English   中英

C#覆蓋具有不同參數的方法

[英]C# overriding a method with different parameters

我正在做一個涉及繼承和覆蓋方法的作業。 我應該創建一個Ship類和CruiseShip子類。 船舶類應該具有兩個成員變量,一個用於船舶名稱的字符串和一個用於船舶建造日期的字符串。 該類還需要一個Print方法來顯示該信息。

CruiseShip子類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();
    }
}

您遇到的問題是您正在創建無狀態類,這實際上是您不應在此分配中執行的操作。

想象一下,我創建了您的其中一艘船:

var myShip = new Ship();

好的,那...這艘船有什么特別之處? 我什么也沒說...船上沒有任何相關信息,它們都是一樣的。 您需要找到一種在船內實際存儲信息的機制,也就是狀態

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進行子類CruiseShip並覆蓋Print並使它做您想要的事情。

您一定要閱讀以下主題:

  1. 構造函數和初始化狀態
  2. 為什么用屬性代替公共成員字段
  3. 只讀成員字段和屬性以及不可變類型

Print方法應從成員變量中獲取其數據,因此不需要任何參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM