搜索

2010年8月30日星期一

鸡可以生蛋,但是蛋不是鸡……

这几天纠结于类组织结构问题,思之再三,自以为得,遂记于此:

面向对象编程,通常他们说得很简单:
  1. 设计通用类
  2. 派生具体类
  3. 派生更具体的类
  4. ……
于是我设计一个语言相关程序的时候:
  1. 先弄个 Language 做基类
  2. 然后派生 Language Tag 做为子类
或者,一个跟 HTML 相关的程序:
  1. 基类 HTML
  2. 派生类 HTML Element
以上看上去都挺合理不是吗?好吧,问题来了:

如果给 Language 添加一个方法:Speak,用来指挥发音设备读出某种语言;然后这个 Speak 方法显然亦自动对 Language Tag 生效,请问,对于 Language Tag 来说,读出一个语言标记码有何意义?

第二个例子,给 HTML 添加一个方法:Show Page,用以显示 HTML 页面,很合理不是吗?请问这个方法自动适用于 HTML Element 的时候,如何针对某个元素显示页面?

总结一下,在面向对象编程中,需要区分层级关系与包含关系,类组织只能以层级关系做为派生逻辑,而不可以把包含关系做为派生逻辑,因为:

鸡可以生蛋,但是蛋不是鸡,鸡可以有生蛋方法,但是蛋绝没有方法生蛋。

没有评论:

发表评论