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

07-09-30 togoever
              

正方形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修改过]

              

xyz0102
2007-09-30 10:14

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

请举例

togoever
2007-10-01 12:54

http://www.jdon.com/jivejdon/thread/31041.html