C#之类的继承、抽象类和虚方法

时间:2023-03-09 09:17:11
C#之类的继承、抽象类和虚方法

代码下载地址

类的继承:

写电池的基类:包含条码和箱体码两个字段,含有两个参数的构造函数

 class Battery
{
public string _barCode;
public string _boxCode; public Battery(string barcode, string boxcode)
{
this._barCode = barcode;
this._boxCode = boxcode;
} public void ShowInformation()
{
Console.WriteLine("该电池的电池码是{0},箱体码是{1}", this._barCode, this._boxCode);
}
}

类WX27继承Battery基类,添加字段_voltage,并重写构造函数和方法:

 class WX27 : Battery
{
public double _voltage;
public WX27(string barcode,string boxcode ,double voltage):base(barcode,boxcode)
{
this._voltage = voltage;
} public new void ShowInformation()
{
Console.WriteLine("该电池的电池码是{0},箱体码是{1},电压是{2}", this._barCode, this._boxCode, this._voltage);
} public void ShowVoltage()
{
Console.WriteLine("万向27的电压为{0}", _voltage);
}
}

测试效果:

 WX27 WX = new WX27("", "dsfdsf",3.33);
WX.ShowInformation();
WX.ShowVoltage(); //output-->(不重写ShowInformation)
//该电池的电池码是123456,箱体码是dsfdsf
//万向27的电压为3.33 //output-->(重写ShowInformation)
//该电池的电池码是123456,箱体码是dsfdsf,电压是3.33
//万向27的电压为3.33

抽象类

Car基类,其中的方法不需要提供方法的具体实现,具体的方法在继承的子类体现。

     abstract class Car
{
abstract public void Run();
}

BYD类继承Car类,需要重写抽象方法

     class BYD : Car
{
public override void Run()
{
Console.WriteLine("BYD汽车可以跑高速!");
}
}

WJ类继承Car类,需要重写抽象方法

     class WJ : Car
{
public override void Run()
{
Console.WriteLine("玩具汽车不能跑高速!");
}
}

测试效果:

 Car c = new WJ();
c.Run();
c = new BYD();
c.Run(); //output-->
//玩具汽车不能跑高速
//BYD汽车可以跑高速!

 虚方法:

构建基类Car,不同于之前的是多了关键字Virtual,如果子类不重写方法Run,则默认调用基类的方法,重写了则调用子类的方法

与抽象类的区别是,虚方法中基类依然提供了具体的方法,可以选择是否重写。

     class Car
{
public virtual void Run()
{
Console.WriteLine("车可以跑!");
}
}

子类BYD继承Car类

     class BYD : Car
{
public override void Run()
{
Console.WriteLine("BYD汽车不仅可以跑,还可以上高速!");
}
}

测试效果:

 Car c = new Car();
c.Run();
c = new BYD();
c.Run(); //output-->
//车可以跑!
//BYD汽车不仅可以跑,还可以上高速!

总结:

对于使用上,类的继承可以让子类拥有数据自己的字段,属性及方法,不同的子类在这一块是可以不一样的。

而类的多态(抽象类、虚方法及接口),则允许使用父类初始化一个子类,用父类直接调用子类的方法,子类的具体实现可以不一样。

继承的子类也可以用基类初始化,但对于子类特有的方法,父类必须通过里氏转化才能调用这些方法。