首先回顾一下OOP思想的发展过程:一开始,OO出自ADT(抽象数据类型),一个对象就是“something with methods”(语出《Design Patterns Explained》)。在这个阶段,我们为了确保“算法”和“数据”之间的松耦合,我们要求声明和实现在不同的文件中进行(C++)。然后,我们开始用“责任”的眼光来看待对象,对象是“something has responsibilities”。于是,我们的实现方式灵活多了:JAVA中不再要求声明和实现在不同的文件。这是因为我们知道,“算法”在抽象类中已经搞定了,具体类里面只有“数据”和被“算法”回调的一些细节方法。各位可以注意一些设计模式,应当可以发现:面向对象设计发展到一定程度之后,已经将算法抽象出来,具体类只负责数据;只有符合算法要求的类才能被用于该算法——这听起来是不是有点象GP?
GP 中新的抽象方式很难理解吗?我倒是不觉得。“它是数据类型的一组需求条件”,只要这个数据类型符合这些需求条件,我们就可以用同样的方法来处理。做个类比:我们都学过高等数学,我们只要知道某个函数符合某个特性,比如连续可导,那我们就可以在完全不知道这个函数具体的定义式是怎样的情况下来讨论这个函数,得出关于这个函数的某些结论。
gigix: I don't know enough of GP to comment about GP but I don't completely agree with you on "面向对象设计发展到一定程度之后,已经将算法抽象出来,具体类只负责数据". In general of OO class hierarchy, child classes not only add details of data but the operation (algorithm) details as well. Sometimes, the whole operator(algorithm) might be completely different.
计算机科学的重要进步,许多是由于发掘了新的抽象性质而促成。一个被当代所有电脑语言支持的决定性抽象性质就是子程序subroutine(又名过程procedure或函数function,不同的语言使用不同的词汇)。C++支持另一种抽象性质:抽象数据类型(abstract data typing,ADT)。是的,在C++中,我们可以定义新的数据类型,以及该类型的基本操作行为。