前言
本文继续介绍面向对象设计原则:迪米特原则、里氏替换原则、接口隔离原则和合成复用原则。
迪米特原则
迪米特原则又称最少知识原则,即把获取变量的过程封装起来,不需要知道获得变量的具体细节。
class A{
public:
int get_a(){return this->a;}
int get_b(){return this->b;}
private:
int a;
int b;
}
里氏替换原则
里氏替换原则:子类可以在任何情况下替换父类。
class T{
public:
T(int length_=1,int width_=2):length(length_),width(width_){}
void resize(){
length++;
}
virtual int get_length(){return this->length;}
virtual int get_width(){return this->width;}
private:
int length;
int width;
};
class S:public T{
public:
S(int length=1):len(length){}
void resize(){
len++;
}
virtual int get_length(){return this->len;}
virtual int get_width(){return this->len;}
private:
int len;
};
void Resize(T* t){
while(t->get_length()<=t->get_width()){
t->resize();
}
}
T* t=new T();
Resize(t);
cout<<t->get_length()<<" "<<t->get_width()<<endl;
//父类T,子类S 当在main函数中如上操作会打印出 3 2
//如果如下操作则会陷入死循环,子类不能在任何情况下替换父类,违背了里氏替换原则。
T* t=new S();
Resize(t);
cout<<t->get_length()<<" "<<t->get_width()<<endl;
接口隔离原则
接口隔离原则其实就是在实现功能的时候,类与类之间的依赖应该尽量可能小。
class A{
public:
int get_a(){return this->a;}
int get_b(){return this->b;}
private:
int a;
int b;
}
//A类中拥有两个get函数,但如果我的B类只想要实现get_a()功能,B直接继承A,就会导致B还会拥有get)b()的功能
//这就违背了接口隔离原则
合成复用原则
类与类之间需要建立联系,优先使用组合或者聚合的方式,最后再考虑继承。