关于首页上的"长方形继承正方形"问题,谈谈从客观世界到面向对象编程中"继承"的一些想法

正方形extends长方形 or not?
有人说继承是为了数据的套用,为了方法的重复利用;还有人居然发现"虽然'正方形 is a 长方形'但是数学意义上适用于长方形的运算不能完全适用于正方形".今天本人厚脸,也来谈谈这个具体的extends问题.
既然就事论事,首先了解一下两者的本质为好.
一般性前提及性质:
四边形A <=> 四条边 & 封闭曲线 => a.内角和360度
平行四边形B <=> A & 对边分别平行 => b.对边分别等长
加入特殊性后得到定义:
四边形C <=> B & 一个直角 <=> A & c.四角相等皆为90度 : 矩形
四边形D <=> B & 邻边等长 <=> A & d.四边等长 : 菱形
可以肯定的是:
四边形E <=> B & 有一个直角 & 邻边等长
<=> C & 邻边等长
<=> D & 一个直角
注意其中,C 没有定义邻边不等,当然D 也没有定义没有直角
即: E extends B & E 有一个直角 & E 邻边等长 ;
或: E extends C & E 邻边等长 -------------------------*
或: E extends D & E 一个直角
现在可以说,适合A,B,C,D 的运算对于 E 都成立.
问题关键是,我们所讨论的"长方形",是否就是上述定义的"矩形"?
一般来说,不会有人特别定义"长方形必须邻边不等",则其同上述的"矩形".
于是有:

Class A{
k;l;m;n;一个角;
A(k,l,m,n,){}
area(...){...}
}//--1.最初的母体,其属性并不只有四条边,还有必须且只须一个角(确定位置,那两条边所夹)的度数.这样才能确定对象,进行各种具体运算.需要注意的是其他三个角度是可以确定的(正如数据表中的衍生属性)
Class B extends A{
k=l;m=n;一个角度;
B(k,m){super(k,k,m,m);}
area(...){...}
}//--2.两组对边分别相等是B的特性.对象的构造函数是用来创建对象的,当然要体现对象本身不同于父类的特性.这种逻辑关系也指引了我们编程的思路.
Class C extends B{
k;m;
C(k,m){super(k,m);一个角=90;}
area(k;m){return k*m;}
}
//--3.C之所以不同于一般的B,当然是因为这里有一个角度已经被确定.这样也就可以自然的写出面积公式.问题是当我们针对一个如此熟悉的C进行运算时,是不曾考虑是否有些内部约束,更是不去考虑是否有一个属性已经被初始化为常量的.
Class E extends C{
k=m;
E(k){super(k,k);}
area(k){return super.area(k,k);}
}
//--4.如果数学上的长方形与正方形的关系不能用面向对象语言来解决,那么面向对象的语言又是来干什么的呢?这里最关键的就是方法的主体了,无论从本质上还是具体编码上,并没有完全抛弃父类另起炉灶.其实调用super不就是继承吗?对比一下构造函数就知道了.super其实又是什么呢?呵呵

请原谅解释如此繁琐,但是这是一个活生生的例子,那么就应该是面向对象语言所足够可以解释通的.之所以溯本逐源,是想说明对象的继承并不是仅仅表面性质上的相似就足以的,而是本质上的'特例化'.有了这种思维才知道什么特性是父类的,什么特性是本身特有的.根据事务本质上的逻辑而不涉及数据的操作存储时,面向对象的语言自然是完全可以解释的.
惯性思维常常叫人不去考虑一些本质的东西.最后想当然的写出一些习以为常的代码,却不真正清楚在写什么,不清楚到底是不是真正的坚持了面向对象.我们却还反过来认为什么"这就是多态,是不能继承的".

小弟java初级,刚来J道,请多指教.
msn:togoever@msn.com
[该贴被togoever于2007年09月30日 03:31修改过]

适用于长方形的运算不能完全适用于正方形??

请举例