疯了!贴代码怎么都没有缩进啊!!
你这么一说。我倒是有点明白了。当然我还是不知道说的对不对。高手指点啊。
应该说,接口就是定义了某些行为或角色的实现标准,就是让实现了接口的类必须可以做出某个行为或扮演某种角色,反过来满足了接口所定义的标准的类,都可以做为这个接口的实现。
接口所定义的标准不仅可以约束实现类,举例:我们用绿色食品的标准生产蔬菜;
而且满足接口定义的标准的类都可以声明自己实现了接口所定义的标准,举例:我们生产的蔬菜符合绿色食品标准。
更具体的说,就是在设计的时候并不一定要先考虑接口怎么设计,我们同样也可以先考虑具体类是什么样子的,然后看看是否能从这些具体类中提取出统一的标准做为接口,方便调用。
举例子:
1、定义一个[可走路的]接口,人可以走路,小狗可以走路,机器人也可以走路。人和小狗可以泛化成动物,可是机器人不是动物,它仍然可以走路。这样就不能用类的继承概念来解释了。但我们可以说,人、小狗和机器人都满足了走路的标准。
2、可以考虑一下我们刚刚学习awt时候的情景,为什么有人会这样写:
public class MyFrame extends Frame implements WindowListener,ActionListener{
//...
}
我们可以说:MyFrame是一个Frame,同时MyFrame扮演了WindowListener和ActionListener的角色,MyFrame可以做WindowListener和ActionListener能做的事,MyFrame满足了做为WindowListener和ActionListener的标准(可以持证上岗了:))。
3、某局长(具体类)是一名公务员(泛化/抽象),同时局长还扮演了父亲,丈夫,党政领导人,高尔夫球运动爱好者,贪恋酒色之徒,财迷,...(各种各样的接口)等角色。
------------------
而抽象类只当作具体类的泛化,确切地说就是定义一组具体类的分类,它可以什么都不实现,根据具体情况提供这些具体类共有的一些方法,而这些方法的选择主要考虑的是这个分类中的对象在这个分类中需要做什么。
还是拿人和小狗举例:我可以定义动物这个抽象类,在我的具体应用中,当我用到“动物”这个分类中的对象时,只需要用到“年龄”这个共有属性和“吃”这个共有动作。那我就可以定义一个抽象类“动物”,它只有“年龄”属性和“吃”这个动作即可。
当我需要使用“动物”这个分类的时候,持有的就是动物的引用。
-------------------
至于长方形和正方形,首先我觉得这个设计有点问题。
在你所设计的类中,正方形的setHeight()/setWidth()与长方型的setHeight()/setWidth()虽然名字相同,但它们实际上是两种不同的动作,它们并不是在设置同一属性。
换句话说,把本应该保持一般性的方法用特殊的方法给覆盖了,Square类中的setHeight/setWidth做了不该它做的事。
如果把名字再区分开,我觉得可以这样加以改进:
public class Rectangle{ setWidth(int width){ this.width = width; } setHeight(int height){ this.height = height; } } public class Square extends Rectangle{ setSquareWidth(int width){ setWidth(width); setHeight(width); } setSquareHeight(int height){ setWidth(height); setHeight(height); } }
|
以上,这样一看是不是觉得用setSquareWidth和setSquareHeight两个方法来设置正方形的一个边长有点多此一举??
那么继续改进Square类:
public class Square extends Rectangle{ setEdgeSize(int size){ setWidth(size); setHeight(size); } }
|
至此,是不是觉得思路有些清晰了呢?然而,在定义了setEdgeSize这个方法之后,正方形的setHeight/setWidth方法又失去了实际意义,不小心调用后可能会出现宽高不一致的现象,更容易出错了。
考虑到正方形的“宽度高度相等”只不过是个特殊条件而已,并不是正方形比长方形更特殊的属性或行为。
也就是说矩形完全可以表示正方形。
这么一看,定义正方形就有点多此一举了。
最终我们只需要一个类就可以了,根本用不到继承:
public class Rectangle{ setWidth(int width){ this.width = width; } setHeight(int height){ this.height = height; } }
|
还有就是,使用长方型(矩形)的客户端,应该有责任去判断矩形是否构成一个正方形,这是client端份内的事。
再有,客户端调用函数时出现的问题似乎永远不会出现,如果传入的确实是正方形,那么while循环根本进不去:
public void resize(Rectangle r){
while(r.getHeight()<r.getWidth){
r.setHeight(r.getWidth+1);
}
}
[该贴被darasion于2008-12-23 14:08修改过]
[该贴被darasion于2008-12-23 16:29修改过]
[该贴被darasion于2008-12-23 17:58修改过]