JAVA长方形正方形_正方形不是长方形的终极解决办法

本文假定读者已经了解有关正方形不是长方形的相关内容。

之前人们讨论的正方形长方形的问题的关键在哪里?我觉得就在于改动长方形的边的长度。我们可以这么考虑一下,一个长方形的instance的边长应该是可变的吗?我觉得一旦一个长方形的边长改变之后它就成了另一个长方形了(一个新的instance)。所以长方形类里面不应该有改变其边长的方法,一个长方形实例各个的边长应当在new它的时候确定下来,并且它们应当是immutable的。基于这种考虑,我设计的长方形和正方形的类如下所示:

//长方形

public class Rectangle {

private final int width;

private final int height;

public Rectangle(int width, int height) {

this.width = width;

this.height = height;

}

public int getWidth() {

return width;

}

public int getHeight() {

return height;

}

public int getArea() {

return width*height;

}

}

//正方形

public class Square extends Rectangle{

private final int side;

public Square(int side) {

super(side, side);

this.side = side;

}

public int getSide() {

return side;

}

}

这种继承关系就既符合现实中的父子关系也遵循LSP。之所以这么设计,我的想法是一个类所具有的方法不应当能够改变其本质。比如有一个Men类,它可以有eat(),sleep(),work(),makeLovewith(Person p)方法,但是如果你在里面定义denatureToWomen(),denatureToEunuch()就很不恰当了,因为这改变了其本质,导致这个Men的实例不再属于Men类(至少已经和现实不吻合)了。除非这两个方法不能改变该实例本质,否则在Men里面定义这两个方法本身就是有问题的。不过如果用下面这种方式定义也许可行:

public Women denatureToWomen() {

Women w = new Women();

//set attributes here

return w;

}

public Eunuch denatureToEunuch() {

Eunuch e = new Eunuch();

//set attributes here

return e;

}

这样一来,调用denatureToWomen()会产生一个新的实例,原来的那个Men实例依然存在,这和现实生活依然不吻合,现实生活中一个实例不光可以上型(upcast),还可以平行型,寒。。。

总之一句话,一个类的方法不应该改变其实例的本质。

posted on 2007-09-20 16:33 teasp 阅读(2494) 评论(13)  编辑  收藏 所属分类: Java学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值