我正在处理一个涉及继承和覆盖方法的任务。我应该创建一个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();
}
}
答案 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 :(得分:0)
Print方法应从成员变量中获取数据,因此不需要任何参数