软件是工业的一个分支,接口和抽象类都是软件工程的产物。
定义
具体类->抽象类->接口:越来越抽象,内部实现的东西越来越少。
为做基类而生的抽象类
函数成员没有完全被实现的类成为抽象类,关键字abstracted修饰。
不允许实例化抽象类,作用1是做基类(继承),2是用基类类型的变量引用子类的实例(派生)。抽象方法被子类所实现,相似 overwrite重写virtual函数,也被成为纯虚方法(c++)。
开放关闭原则
大意是如果不是为了修bug和修改功能,不要去修改类的函数成员的代码,封装稳定的成员函数,不确定的成员封装成抽象成员,用于子类的继承。
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Main(string[] args)
{
Vehicle v=new Car();
v.Run();//现在我们用Vehicle类型的变量去引用car类型的实例,是无法获取到方法的。
}
}
class Vehicle
{
public void Stop()
{
Console.WriteLine("Stopping");
}
}
class Car:Vehicle
{
public void Run()
{
Console.WriteLine("car is running");
}
}
class Truck:Vehicle
{
public void Run()
{
Console.WriteLine("Truck is running");
}
}
}
using System;
namespace ConsoleApplication1
{
class Program
{
public static void Main(string[] args)
{
Vehicle v=new Car();
v.Run();
}
}
class Vehicle
{
public void Stop()
{
Console.WriteLine("Stopping");
}
public virtual void 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");
}
}
}
所以把Vehicle这个类就可以变成抽象类,子类的同名方法要加override
abstract class Vehicle
{
public void Stop()
{
Console.WriteLine("Stopping");
}
public abstract void Run();
}
为解耦而生的接口--完全未实现逻辑的类
接口一定是纯抽象类(成员函数没有具体内容)和公开的,所以abstract和public在类名和成员函数前省略, 类名前只加一个interface,类里void+成员函数名。
抽象类和接口的区别
抽象类可以有字段和非public成员,他们代表了具体逻辑;
而接口只有成员函数, 且全为public,public为隐式。
他们都不能实例化,只能用来声明变量,引用具体类的实例。
补充
solid设计模式
单一功能原则
开闭原则
里氏替换原则
接口隔离原则
依赖反转原则
设计模式的学习需要熟练使用solid原则,设计模式则是由这些基础原则演化而来。