本文假定讀者已經(jīng)了解有關(guān)正方形不是長(zhǎng)方形的相關(guān)內(nèi)容。
之前人們討論的正方形長(zhǎng)方形的問(wèn)題的關(guān)鍵在哪里?我覺(jué)得就在于改動(dòng)長(zhǎng)方形的邊的長(zhǎng)度。我們可以這么考慮一下,一個(gè)長(zhǎng)方形的instance的邊長(zhǎng)應(yīng)該是可變的嗎?我覺(jué)得一旦一個(gè)長(zhǎng)方形的邊長(zhǎng)改變之后它就成了另一個(gè)長(zhǎng)方形了(一個(gè)新的instance)。所以長(zhǎng)方形類里面不應(yīng)該有改變其邊長(zhǎng)的方法,一個(gè)長(zhǎng)方形實(shí)例各個(gè)的邊長(zhǎng)應(yīng)當(dāng)在new它的時(shí)候確定下來(lái),并且它們應(yīng)當(dāng)是immutable的。基于這種考慮,我設(shè)計(jì)的長(zhǎng)方形和正方形的類如下所示:
//長(zhǎng)方形
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;
}
}
這種繼承關(guān)系就既符合現(xiàn)實(shí)中的父子關(guān)系也遵循LSP。之所以這么設(shè)計(jì),我的想法是一個(gè)類所具有的方法不應(yīng)當(dāng)能夠改變其本質(zhì)。比如有一個(gè)Men類,它可以有eat(),sleep(),work(),makeLovewith(Person p)方法,但是如果你在里面定義denatureToWomen(),denatureToEunuch()就很不恰當(dāng)了,因?yàn)檫@改變了其本質(zhì),導(dǎo)致這個(gè)Men的實(shí)例不再屬于Men類(至少已經(jīng)和現(xiàn)實(shí)不吻合)了。除非這兩個(gè)方法不能改變?cè)搶?shí)例本質(zhì),否則在Men里面定義這兩個(gè)方法本身就是有問(wèn)題的。不過(guò)如果用下面這種方式定義也許可行:
public Women denatureToWomen() {
Women w = new Women();
//set attributes here
return w;
}
public Eunuch denatureToEunuch() {
Eunuch e = new Eunuch();
//set attributes here
return e;
}
這樣一來(lái),調(diào)用denatureToWomen()會(huì)產(chǎn)生一個(gè)新的實(shí)例,原來(lái)的那個(gè)Men實(shí)例依然存在,這和現(xiàn)實(shí)生活依然不吻合,現(xiàn)實(shí)生活中一個(gè)實(shí)例不光可以上型(upcast),還可以平行型,寒。。。
總之一句話,一個(gè)類的方法不應(yīng)該改變其實(shí)例的本質(zhì)。
posted on 2007-09-20 16:33
teasp 閱讀(2729)
評(píng)論(13) 編輯 收藏 所屬分類:
Java學(xué)習(xí)