C++和面向对象的一点看法,欢迎讨论 (谈多态 1)
近来参与dynamic_pump的“C++的多态与重载好象作用差不多,谁能讲讲啊?”(hppt://www.csdn.net/Expert/topic/488/488294.shtm)的讨论,觉得很有意思。于是,想把这问题括充一下与各位共同学习。
我常碰到“怎样来衡量C++代码是否面向对象(OO)或在面向对象方面做得好不好?”这样一个问题。我觉得这是个很不好回答的问题,而且回答好这个问题对我本身对OO的认识很有帮助。
我认为,面向对象(OO)至少包含以下几方面(有些中文翻译我不知道,请原谅):
1。Abstraction;
2。Encapsulation;
3。Inheritance(继承);
4。Polymorphism(多态)。
这里最不直观的是多态,所以先对它和大家一起来探讨一下。
Polymorphism是希腊词,意为“many forms”或“many types”。显然它的意思不够清楚。我找来我所有关于OO的书(大约十来本,有讲语言的,OOA/OOD的,OO modeling的,面向对象的软件工程OOSE的,还有design patten设计模式等),比较了一下各位作者的看法。总的说来看大致分为三类:广义的多态,狭义的多态,和较普遍接受的多态。
广义的多态包括重载和覆盖,它可以是早捆绑(static binding)或晚捆绑(dynamic binding or run-time binding)。我只在Grady Booch的<<Object-Oriented Analysis and Design>>见到这样的说法。
狭义的多态只包括晚捆绑的覆盖,我只在“四人帮”的<<设计模式>>上见到。
较普遍的看法是(Ivar Jacobson的):"Polymorphism means that the sender of a stimulus does not need to know the receiving instance's class. The receiving instance can belong to an arbitraty class". 显然它包含早捆绑和晚捆绑。比如在下面的C++代码中就用到它们:
class Shape
{
public:
Shape(const char *shapeName);
virtual ~Fruit();
const char *name() const { return _name; }
virtual void draw(Window &wd) const ;
...
private:
...
char *_name;
};
void drawShape(const Shape &shape)
{
Window window(...);
...
window.printText(shape.name()); //polymorphism with 早捆绑.
shape.draw(window); //polymorphism with 晚捆绑.
...
}
先说这么多,希望听听大家的意见。