在C#中,我正在尝试使用类和继承,我想看看我是否正确掌握了这个概念。
在我的例子中,我创建了一个基类'Car',它由成员'制造商'和'模型'组成 - 即所有汽车都有的常见事物。
然后我从我的基础Car类中定义了两个派生类:
SportsCar
其他成员与跑车有关 - 自然是颜色和最高速度。
FamilyWagon
其替代成员与更明智的车型相关 - mpg和启动量。
两个派生类都包含一个方法,该方法返回将基本Car Class成员的值和派生类成员写入控制台。
最后,我创建了一个SportsCar
和FamilyWagon
的实例对象,并在调用方法显示值之前设置了基类和派生类特定成员。
我的代码有效(奖金!)但是我试图了解使用基类是否真的有意义,为什么不创建SportsCar
类和FamilyWagon
类。我继承类路由的论点是,我可以使用基类来覆盖所有汽车共有的通用成员,并使用基类作为模板,我可以在其中建立我将来定义的任何其他汽车类型。 / p>
class Program
{
static void Main(string[] args)
{
SportsCar Sporty = new SportsCar();
Sporty.SetGenericValues("Flaming Fandango", "Woosh");
Sporty.SetCustomVals("Red", "200");
FamilyWagon Clunker = new FamilyWagon();
Clunker.SetGenericValues("Practical", "SnoozeFest");
Clunker.SetCustomVals("60", "50");
Console.WriteLine (Sporty.strDetails());
Console.WriteLine (Clunker.strDetails());
Console.ReadKey();
}
}
public class Car
{
protected string Manufacturer, Model;
public void SetGenericValues(string Manufacturer, string Model)
{
this.Manufacturer = Manufacturer;
this.Model = Model;
}
}
public class SportsCar : Car
{
protected string Colour, MaxSpeed;
public void SetCustomVals(string Colour, string MaxSpeed)
{
this.Colour = Colour;
this.MaxSpeed = MaxSpeed;
}
public string strDetails() { return ("Manufacturer: " + Manufacturer + Environment.NewLine + "Model: "+ Model + Environment.NewLine + "Colour: " + Colour + Environment.NewLine + "Max Speed: " + MaxSpeed); }
}
public class FamilyWagon : Car
{
protected string MPG, BootVolume;
public void SetCustomVals(string MPG, string BootVolume)
{
this.MPG = MPG;
this.BootVolume = BootVolume;
}
public string strDetails() { return ("Manufacturer: " + Manufacturer + Environment.NewLine + "Model: " + Model + Environment.NewLine + "MPG: " + MPG + Environment.NewLine + "Boot Volume: " + BootVolume); }
}
答案 0 :(得分:-1)
正如其他人所指出的,使用基类允许代码可重用性并提供多态性。虽然不是实现这一目标的唯一方法,但它是继承的一个重要特征:扩展Car
的所有内容是Car
,因此您可以拥有以下内容:
var allCars = new List<Car>();
allCars.Add(ferrariPortofin);
allCars.Add(bmwStationWagon);
foreach (var car in allCars) { ... }
但是,您尚未触及的继承最重要的特征之一是虚拟和覆盖方法的概念。请考虑以下事项:
public class Car
{
//...
public virtual string StrDetails() {
return $"{Manufactures}, {Model}";
}
public class SportsCar: Car
{
//...
public override string StrDetails() {
return $"{Manufactures}, {Model}, {Colour}, {MaxSpeed}";
}
public class FamilyWagon: Car
{
//...
public override string StrDetails() {
return $"{Manufactures}, {Model}, {MPG}, {BootVolume}";
}
现在,你可以这样做:
foreach (var car in allCars) { Console.WriteLine(car.StrDetails); }
猜猜将要打印出来的内容。
注意:您实际上并不需要StrDetails
,object.ToString()
虚拟,因此您可以覆盖该方法(请记住,所有类和结构都是非法继承的)来自object
)。
注2:重要的是要认识到继承并不是实现多态性和代码可重用性的通用工具。根据具体情况,还有其他可用的工具同样有效;界面,构图等