呵呵,那么我可能明白你的意思了,你是说长方形具备一个setsize(x,y)的方法,而正方形可能只需要setsize(x)的方法,你觉得如果是正方形使用setsize(x,y)的时候不容易处理,而且必须对客户交代是么??

我觉得我们现在一直再说要面对接口的编程,而不是面对类的编程,是为了什么??我们是要这个东西实现目的,你setsize设定了长度,就是为了设定而设定么??我想不是吧,你的最终目的是为了计算面积或者周长吧。那么你在设计的时候需要把setsize也作为接口设计么??他是为了配合目标而出的一个方法,并不是你最终完成功能所需的方法,所以这个方法没有必要。你可以使用rectangle(x,y) square(x)构造方法来解决。当然真正的设计中要比这个复杂,但是目标必须明确。

再说 生育期妇女 问题,如果我们的系统是一个关于人一生描述的演示系统,你可以选择一个性别,年龄等一些值来模拟生活(比如虚拟人生游戏)那么 生育期妇女 你是否作为一个子类出现那??我们分析东西必须要有特定的环境,不能泛指希望它尽量的大,设计的问题是让他够用且方便扩展,而不是大而全

配置文件之类我觉得是实现的时候要考虑的,真正的设计是应该于语言无关的,代码大全的作者说希望伪代码用一种语言,而真正的用另外一种语言。我们当然做不到这样。因为有些语言特性实在是限制的非常死,但目标就是你的设计一定不能绑定在语言的层面或者xml,db上。

你说的设计是为了够用且方便扩展,而不是大而全.这点我是完全同意的.比如长方形作为顶级父类不用把四个边都表达出来,直角也不用表达.因为我们在这个简单的环境中完全用不到.
你说的不限定在某个语言上,我也同意.我们讨论的是前端的分析过程.
我想表达的是意思是.现在面向对象的里面类的定义过于简单.缺乏显式的约束表达.这些约束表达的逻辑代码不能再四处分散在各个类中,而是应该作为有归属的东西.当然不是所有的约束都是类必需的.
类的定义应该包含3大块,属性,约束,行为.这样类的定义才完整.

我说一下我的观点
一开始的设计我觉得应该是为了目标而设计的,比如说我们通过阅读需求知道有个图形shape对象,那么我们要这个对象是为了计算面积,计算周长,还是为了显示的??
那么定义方法。然后找出这些对象的关系就好了。

属性的目的是为了实现目的,标识对象,属于第二阶段的事情。shape可能需要长度,大小,这个时候我们其实就应该知道这个对象差不多是什么了。比如系统里面就是要圆形跟方形,那么就可以设定值,然后计算。一般我比较喜欢用构造方法。但是有时确实有些不是太灵活,且可能出现冗余。但是可以减少可以setter的属性,基本上如果不是必须,我会尽量减少它。

约束是什么??对数据的检验,对于数据检验通常的做法是硬编码,或者使用配置文件。应当属于运行期的事情。必须确定的知道是什么才可以进行,这个时期大部分已经不属于设计了,或者已经是详细设计后期了。可以通过文档来绑定。

为了目标而设计,但是首先要清楚地映射真实世界的事物以及他们之间的联系,可是任何时候都不可以动摇地。如果不是为了这个目标,那么这就不是oo的设计。

我觉得你的分析过程有问题,需求中很少上来就知道一个shape的。一般是先在需求中有了圆和长方形之类的,才会抽象出多边形这个东西。就好像我们在电子商务中,一般情况都先上来知道了,购物者,销售者,经理,前台工作人员,等等。我们才抽象出一个Person的类来。
当然不排除有桌面系统上来就知道了多边形这东西。
好,上面都是旁话。
很清楚看到.一个孤立的类来说,它是否有约束并不重要.甚至他的存在也是无意义的。而一旦类有了联系,那么约束也就随之而来了。
关于类的至关重要的约束的具体内容那是后来的事情,但是我们首先明确这个约束是类本身的,不可或缺的。这就够了。我们要把验证雷是否成立这个职责从别的类手中还回来.目的仅到此。

还有你把这一切都想的太理想,分析设计这都是一个迭代的问题。在详细设计的时候挖掘出需求也是很正常的,从而改动分析.

>关于类的至关重要的约束的具体内容那是后来的事情,但是我们首先明确这个约束是类本身的,不可或缺的。这就够了。我们要把验证雷是否成立这个职责从别的类手中还回来.目的仅到此。

同意你这个观点,所以我希望尽量用构造函数来尽可能多的设定值,这就是说,如果某个条件不符合,那么就不应当存在这样的东西。

shape是我的一个举例,从客户需求到真正的设计中间的事情很多的,但是最终实现的设计必然是抽象的,具备完备功能性的。

分析设计是一个需要经验的工作,迭代是必然的。不过如果在详细设计的时候需要修改整个框架,那么你的设计就是失败的。没有实现完备功能的设计不称之为设计结束(该设计为架构设计)。

关于女人生孩子的问题,内部约束自然没什么问题了
不过“生子”这个功能所有适龄雌性生物正常来讲都可以的
是不是可以定义一个Procreater类型合成到Person里面?

可以,但是需要看看是否具备通用型
如果不具备就不需要过多的增加类

呵呵, 《敏捷软件开发-原则模式与实践》在说明开闭原则时也提及了这个例子,类继承应该从行为的角度考虑。
其实我倒觉得很多问题并不是只有惟一的答案,关键是要看使用的场合,不同情景的灵活运用。没有必要过分的追求原则和惯用法。
现实世界和计算机语言所表达的世界毕竟还是有区别的,关键就在于人的思考。呵呵~

长方形和正方形的定义,长方形也就是矩形:为四个内角相等的平行四边形。正方形,是平行四边形;有一个角是直角;. 有一组邻边相等。
这里的正方形的定义我觉得可以通过继承长方形的定义方式来实现:正方形,是为四个内角相等的平行四边形,且有一组邻边相等。“且有一组邻边相等”的约束注定正方形是长方形的特例。基于具有继承关系的约束条件,我们的oo定义的正方形类继承长方形类,长方形类继承平行四边形类。

长方形也就是矩形:为四个内角相等的平行四边形。正方形,是平行四边形;有一个角是直角;. 有一组邻边相等。基于具有继承关系的约束条件,我们的oo定义的正方形类和长方形类实际上都分别继承了平行四边形类。在这里,长方形类的“四个内角相等的平行四边形”与正方形类的“是平行四边形;有一个角是直角”约束的结果虽然是等价的,但约束的实现方式却不一样。

个人认为这是因为java的单继承引起的,
正方形是长方形,
同时必须是菱形
不仅仅是单继承,
数学里的充要条件而已

>java的单继承
单继承不是java的错,是我们思维的错,事物都分主要矛盾和次要矛盾,而且主要矛盾总是单一的,所以单继承是客观合理的.不想在这里过多争辩,只是注解一下.

为什么要继承一个类?因为要重用它的数据和代码。继承的概念仅此而已。抽象地讨论继承的意义是不恰当的。

thao_chuan

小弟刚学JAVA几个月,我也来说说我的想法,让各位前辈指点。我觉得只所以要继承就是因为父类的东西子类可以用。只有有了继承我们才能站在巨人的肩膀上前进。但是不是说父类的东西子类都能用。当一个子类继承一个父类时,我们只要关心子类能用的东西就行了,用不到的东西就不用管。

既然就事论事,首先了解一下两者的本质为好.
一般性前提及性质:
四边形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(...){...}
}
Class B extends A{
k=l;m=n;
B(k,m){super(k,k,m,m);}
area(...){...}
}
Class C extends B{
k;m;
C(k,m){super(k,m);}
area(k;m){return k*m;}
}

Class E extends C{
k=m;
E(k){super(k,k);}
area(k){return super.area(k,k);}
}
可能有大侠不懈如此繁琐,banq大哥似乎也不以为然,但是既然这是一个活生生的例子,那么就应该是面向对象语言所足够可以解释通的.之所以溯本逐源,是想说明对象的继承并不是仅仅表面性质上的相似就足以的,而是本质上的'特例化'.有了这种思维才知道什么特性是父类的,什么特性是本身特有的.根据事务本质上的逻辑而不涉及数据的操作存储时,面向对象的语言自然是完全可以解释的.

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

>之所以溯本逐源,是想说明对象的继承并不是仅仅表面性质上的相似就足以的,而是本>质上的'特例化'.有了这种思维才知道什么特性是父类的

非常不错,有自己的思考,而且能够深入业务模型进行探究,这是我们在实际业务建模中必须具有的探察能力,唯有如此,才能抓住事物本质。