C# 我理解继承类属性的意义了吗
在C#中,我正在试验类和继承,我想看看我是否正确地掌握了这个概念 在我的示例中,我创建了一个基类“Car”,该基类由成员“Manufacturer”和“Model”组成,即所有汽车都具有的公共内容 然后,我从我的基本汽车类中定义了两个派生类:C# 我理解继承类属性的意义了吗,c#,inheritance,C#,Inheritance,在C#中,我正在试验类和继承,我想看看我是否正确地掌握了这个概念 在我的示例中,我创建了一个基类“Car”,该基类由成员“Manufacturer”和“Model”组成,即所有汽车都具有的公共内容 然后,我从我的基本汽车类中定义了两个派生类: SportsCar,它具有与跑车相关的附加成员-当然是颜色和最大速度 FamilyWagon拥有与更合理的车型相关的备用成员-mpg和后备箱容量 这两个派生类都包含一个方法,该方法返回并将基本Car类成员的值以及派生类成员的值写入控制台 最后,在调用方
,它具有与跑车相关的附加成员-当然是颜色和最大速度SportsCar
拥有与更合理的车型相关的备用成员-mpg和后备箱容量FamilyWagon
SportsCar
和FamilyWagon
的实例对象,并设置了基成员和派生的类特定成员
我的代码是有效的(奖励!),但我试图了解使用基类是否有实际意义,以及为什么不创建一个SportsCar
类和FamilyWagon
类。我选择继承类路线的理由是,我可以使用基类覆盖所有汽车通用的通用成员,并使用基类作为模板,在模板上我可以基于将来定义的任何其他汽车类型
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); }
}
正如其他人所指出的,使用基类可以实现代码的可重用性并提供多态性。虽然不是实现这一点的唯一方法,但它是继承的一个重要特性:扩展
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
,对象。ToString()
是虚拟的,因此您可以重写该方法(请记住,所有类和结构都不需要从对象继承)
注2:重要的是要认识到继承并不是实现多态性和代码重用性的万能工具。根据具体情况,还有其他工具同样有效;接口、组成等。跑车是否没有MPG测量值?它们是电的还是什么的?此外,家用汽车没有颜色吗?你明白我的意思了吗?继承的最大好处之一是可以减少代码的重用。如果没有Car
作为基类,其他两个类中的每一个都需要实现自己的Manufacturer
和Model
。为了避免在两个类中使用相同的代码,它们可以从基类继承这些属性,这意味着您只需要编写一次代码,而不是两次。想象一下,如果有10个类继承自基类,您将节省多少代码。这个问题与主题无关。请改用。@Sudsy1002继承不是代码重用工具。基类的存在需要比仅仅将这两个字段添加到其他两个类需要更多的代码。有更好的工具可以避免代码中的重复。如果您试图将代码塞进不适合它们的继承层次结构中,只是为了避免重复,您将为自己创建比保存更多的工作。@Sudsy1002继承与代码重用无关。当模型不需要继承时,还有其他更好的方法来实现重用。