以下是披着面向对象外衣的面向过程编程(我们项目里面有很多这样的情况),请改编成真正的面向对象程序。
class T { };
class T1 : public T
{
public:
void DoSth1(){ }
};
class T2 : public T
{
public:
void DoSth2(){ }
};
void foo(T* pT)
{
T1* pT1 = dynamic_cast<T1*>(pT);
if (pT1 != NULL) {
pT1->DoSth1();
}
T2* pT2 = dynamic_cast<T2*>(pT);
if (pT2 != NULL) {
pT2->DoSth2();
}
}
参考答案:
C++的面向对象风格:
struct T { virtual void Do()=0; //新增的 };
struct T1:public T
{
virtual void Do() { DoSth1(); }
void DoSth1(){ }
};
struct T2:public T
{
virtual void Do() { DoSth2(); }
void DoSth2(){ }
};
void foo(T* pT) //客户端代码
{
pT->Do(); //使用虚函数替换dynamic_cast
}
面向对象相对面向过程的优势在哪里?更好的符合开闭原则(对扩展开放,对修改关闭)。
例如要增加T3类型,面向过程的代码里面要修改已有代码foo函数(增加分支),
面向对象的代码只要增加T3类型就OK了,不需要改动客户端代码(foo函数),
这叫向后兼容(后人写的程序可以被前人调用)。