学习刘铁锰老师的C#语言入门详解笔记
购买了一个小汽车Car,小汽车有Run和Stop两个方法
class Car {
public void Run() {
Console.WriteLine("Car is run!");
}
public void Stop() {
Console.WriteLine("Stopped!");
}
}
又购买了一个卡车Truck,卡车也同样有Run和Stop两个方法
class Truck {
public void Run() {
Console.WriteLine("Truck is run!");
}
public void Stop() {
Console.WriteLine("Stopped!");
}
}
由于两辆车都具有相同的Stop和Run方法,所以可以创建Vehicle作为基类,将Stop和Run方法放在Vehicle基类中,由于Run这个方法所打印的内容有所不同,所以可以通过添加“参数”的方法进行判别
class Vehicle {
public void Stop() {
Console.WriteLine("Stopped!");
}
public void Run(string type) {
if (type == "Car") {
Console.WriteLine("Car is run!");
} else if (type == "Truck") {
Console.WriteLine("Truck is run!");
}
}
}
class Car : Vehicle {
}
class Truck : Vehicle {
}
但如果以此为解决方法的话,后期增加其他类型的汽车,对于Run这个方法需要继续增加else if判断,很麻烦,而且违背了“开闭”原则,除了修Bug和增加方法外,不应该去修改类的代码
所以可以使用虚方法,将Vehicle类中的Run方法加上virtual,使得后面继承它的类可以重写这个方法
namespace abstract{
internal class Program {
static void Main(string[] args) {
Vehicle v1 = new Car();
v1.Run();//The car is running ...
Vehicle v2 = new Truck();
v2.Run();//The truck is running ...
}
}
class Vehicle {
public void Stop() {
Console.WriteLine("Stopped!");
}
public virtual void Run() {
Console.WriteLine("The vehicle is running ...");
}
}
class Car : Vehicle {
public override void Run() {
Console.WriteLine("The car is running ...");
}
}
class Truck : Vehicle {
public override void Run() {
Console.WriteLine("The truck is running ...");
}
}
}
由于基类Vehicle不会被调用,所以将Vehicle写成抽象类更简洁,抽象类和抽象的方法要加上abstract,注意:抽象类的方法不允许是private
namespace abstract{
internal class Program {
static void Main(string[] args) {
Vehicle v1 = new Car();
v1.Run();//The car is running ...
Vehicle v2 = new Truck();
v2.Run();//The truck is running ...
}
}
abstract class Vehicle {
public void Stop() {
Console.WriteLine("Stopped!");
}
public abstract void Run();
}
class Car : Vehicle {
public override void Run() {
Console.WriteLine("The car is running ...");
}
}
class Truck : Vehicle {
public override void Run() {
Console.WriteLine("The truck is running ...");
}
}
}
在抽象类上还有更抽象的类,也就是接口,接口的写法如下,接口的命名规则是以大写的“i”开头,例:IVehicle,注意:接口的方法只能是public
namespace interface{
internal class Program {
static void Main(string[] args) {
IVehicle v1 = new Car();
v1.Run();//The car is running ...
IVehicle v2 = new Truck();
v2.Run();//The truck is running ...
}
}
interface IVehicle {
void Stop();
void Run();
}
class Car : IVehicle {
public void Run() {
Console.WriteLine("The car is running ...");
}
public void Stop() {
throw new NotImplementedException();
}
}
class Truck : IVehicle {
public void Run() {
Console.WriteLine("The truck is running ...");
}
public void Stop() {
throw new NotImplementedException();
}
}
}