【C#语言入门】21. 抽象类与开闭原则
一、什么是接口和抽象类
- 接口和抽象类都是“软件工程的产物”
- 具体类——》抽象类——》接口:越来越抽象,内部实现的东西越来越少
- 抽象类是未完全实现逻辑的类(可以有字段和非public成员,他们代表了“具体逻辑”,至少有一个抽象,且不能为private)
- 抽象类为复用而生:专门作为基类来使用,也具有解耦功能
- 封装确定的,开放不确定的,推迟到合适的子类中去实现
- 接口是完全未实现逻辑的“类”(纯虚类;只有函数成员;成员全部public)
- 接口为解耦而生:“高内聚,低耦合”,方便单元测试
- 接口设计一个“协约”,早已为工业生产所熟知(有分工必有协作,有协作必有协约)
- 它们都不能实例化,只能用来声明变量,引用具体类(concrete class)的实例
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
static void Main(string[] args)
{
}
}
abstract class Student//一旦一个类里面有了抽象方法,那他就成为了抽象类,需要加上abstract
{
abstract public void Study();
}
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
static void Main(string[] args)
{
Vehicle v1 = new Truck();
v1.Run();
}
}
abstract class Vehicle
{
public void Stop()
{
Console.WriteLine("Stopped.");
}
public void Fill()
{
Console.WriteLine("Pay and fill");
}
//public virtual void Run()
//{
// Console.WriteLine("Vehicle is running");
//}
public abstract void Run();
}
class Car:Vehicle
{
public override void Run()
{
Console.WriteLine("Car is rumming.");
}
}
class Truck:Vehicle
{
public override void Run()
{
Console.WriteLine("Truck is rumming.");
}
}
class RaceCar : Vehicle
{
public override void Run()
{
Console.WriteLine("RacCar is running.");
}
}
//为做基类而生的“抽象类”与“开放/关闭原则”
class Program
{
static void Main(string[] args)
{
Vehicle v1 = new Truck();
v1.Run();
}
}
interface IVehicleBase//接口默认都是abstruct和public
{
void Stop();
void Run();
void Fill();
}
//在C#中纯抽象类就是接口
//abstract class VehicleBase
//{
// abstract public void Stop();
// abstract public void Fill();
// abstract public void Run();
//}
abstract class Vehicle:IVehicleBase
{
public void Stop()
{
Console.WriteLine("Stopped.");
}
public void Fill()
{
Console.WriteLine("Pay and fill");
}
//public virtual void Run()
//{
// Console.WriteLine("Vehicle is running");
//}
public abstract void Run();
}
class Car:Vehicle
{
public override void Run()
{
Console.WriteLine("Car is rumming.");
}
}
class Truck:Vehicle
{
public override void Run()
{
Console.WriteLine("Truck is rumming.");
}
}
class RaceCar : Vehicle
{
public override void Run()
{
Console.WriteLine("RacCar is running.");
}
}
//Engine与Car紧耦合,然后Engine出现Bug那么Car也会受阻。假设十人团队中有九个人的代码紧耦合了剩下的一个人,当他的代码出现问题,那么九个人的工作都会受阻。
class Program
{
static void Main(string[] args)
{
var engine = new Engine();
var car = new Car(engine);
car.Run(3);
Console.WriteLine(car.Speed);
}
}
class Engine
{
public int RPM { get; private set; }
public void Work(int gas)
{
this.RPM = 1000 * gas;
}
}
class Car
{
private Engine _engine;
public Car(Engine engine)
{
_engine = engine;
}
public int Speed { get; private set; }
public void Run(int gas)
{
_engine.Work(gas);
this.Speed = _engine.RPM / 100;
}
}
本文含有隐藏内容,请 开通VIP 后查看