027抽象类与开闭原则
一、抽象类
- 定义:函数成员(无方法体)没有被完全实现的类。其子类去实现函数成员。不允许实例化。
- 用途:1.作为基类;2.作为子类对象的引用。
二、开闭原则
封装不变、稳定、固定、确定类型的成员,把不确定,有可能改变的成员声明为抽象成员,并且留给子类去实现。
- 接口:看作是 纯虚类。
例子:接口–抽象类–具体类 架构
三、示例
代码如下(示例):
namespace _027抽象类与开闭原则
{
internal class Program
{
static void Main(string[] args)
{
Vehicle v = new RaceCar();
v.Run();
}
}
//纯抽象类,3个抽象方法 即 特别抽象--抽象--具体 变化过程
abstract class VehicleBase
{
abstract public void Stop();
abstract public void Fill();
abstract public void Run();
}
//子类实现了两个
abstract class Vehicle : VehicleBase
{
public override void Stop()
{
Console.WriteLine("stop!");
}
public override void Fill()
{
Console.WriteLine("Pay and fill...");
}
//abstract public void Run();继承的没有实现
}
//实现Run方法
class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("car is running!");
}
}
class Truck : Vehicle
{
public override void Run()
{
Console.WriteLine("Truck is running!");
}
}
class RaceCar : Vehicle
{
public override void Run()
{
Console.WriteLine("RaceCar is running");
}
}
}
可进一步修改,完全抽象的类为接口:注意对比关键字修改位置处
namespace _027抽象类与开闭原则
{
internal class Program
{
static void Main(string[] args)
{
Vehicle v = new RaceCar();
v.Run();
}
}
//纯抽象类,3个抽象方法 即 特别抽象--抽象--具体 变化过程
interface IVehicle
{
void Stop();
void Fill();
void Run();
}
//子类实现了两个
abstract class Vehicle : IVehicle
{
public void Stop()
{
Console.WriteLine("stop!");
}
public void Fill()
{
Console.WriteLine("Pay and fill...");
}
//继承的没有实现,需要定义抽象成员出来
abstract public void Run();
}
//实现Run方法
class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("car is running!");
}
}
class Truck : Vehicle
{
public override void Run()
{
Console.WriteLine("Truck is running!");
}
}
class RaceCar : Vehicle
{
public override void Run()
{
Console.WriteLine("RaceCar is running");
}
}
}
总结
学习了抽象类,引入了接口由来。