Last_Dodo 2002年01月30日
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 晚捆绑.
...
}

先说这么多,希望听听大家的意见。
...全文
251 点赞 收藏 27
写回复
27 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告