什么是SOLID?
【SOLID】是5个面向对象设计原则的首字母组合,它们分别是:
(1)Single Responsibility Principle(SRP) ——单一职责原则
(2)Open Close Principle(OCP)——开放关闭原则
(3)Liskov Subsititution Principle(LSP)——里氏替换原则
(4)Interface Segreguation Principle(ISP)——接口隔离原则
(5)Dependency Inversion Principle(DIP)——依赖反转原则
这5个设计原则孕育出了几十种设计模式,设计模式是基于基本原则的更固定更高阶的用法
为做【基类】而生的【抽象类】
- 抽象方法:被"abstract"所修饰,只有返回值,方法名和参数列表,而没有方法体的方法,就是抽象方法
如果一个类中含有抽象成员,那么这个类也就成了抽象类,必须用’abstract"修饰,否则编译器会报错
//抽象类
abstract class Vehicle
{
abstract public void Run(); //抽象方法
}
-
所以对抽象类可做如下定义:
抽象类就是:函数成员未被完全实现的类;也就是说,抽象类中可以有若干个函数成员,但至少有一个函数成员,是未被实现的(被"abstract"修饰)扫描二维码关注公众号,回复: 8823408 查看本文章 -
而且,抽象类中未被实现的函数成员,其访问级别不能为"private",因为在子类中要将其实现
-
编译器不允许实例化抽象类,可以说:抽象类就是为做基类而生的,它的作用是:
(1)作为基类,在派生类中实现没有被实现的函数成员
(2)用基类类型的变量引用派生类类型的实例(多态) -
抽象类唯一能做的事情,就是给别的类当基类,以基类类型来声明变量,并引用那些已经完全实现了它的抽象成员的子类类型的实例,表现多态
开闭原则
【如果不是为了修复bug或添加功能,闲着没事儿别老去修改一个类的代码,特别是该类当中的函数成员的代码——我们应该封装那些不变的,稳定的,固定的,确定的成员,而把那些不确定的,有可能改变的成员声明为抽象成员,并留给子类去实现】
抽象类和开闭原则的应用
注意代码是如何一步步重构的
(1)变量v无法调用到 Run()方法,是因为在Vehicle类中并没有定义此方法
(2)糟糕的解决方法
(3)也可以利用重写
(4)更好的是将其写成抽象类
注意:子类实现父类未实现的抽象方法时,要加上 “override”
什么是接口?
有没有一个抽象类中的所有函数成员都是抽象成员?
当然有
一个纯抽象类/纯虚类,实际上就是接口