我有一個接口Polygon,然後我有一個類Quadrilateral。然後,我有兩個類,Square和Rectangle,它擴展了Quadrilateral。Square/Rectangle(帶約束不變式)之間的繼承關係共享Quadrilateral基底
四邊形由實例變量sideA,sideB,sideC和sideD組成。它包含方法area()和perimeter()來計算任何四邊形的面積和周長。
考慮到這一點,Square類有一個實例變量lengthOfSides,而Rectangle類有兩個實例變量,長度和寬度。由於四邊形中的方法面積和周長可以用於計算任何四邊形(包括正方形和矩形)的面積和周長,所以我認爲最好只是構造一個Square或Rectangle,然後調用超類分配邊(四邊形需要用於面積和周長計算)。另外,當Square或Rectangle中的實例變量發生變化時,設置器也會更新父類中的關聯值。
這裏是Square類:
/**
* A model for a Square.
*
* @author BTKS
*/
public class Square extends Quadrilateral {
private static final double ANGLES_SUM = 180; // the total sum of two opposite angles in degrees
private double lengthOfSides; // the length of each side
/**
* Construct a new Square.
*
* @param lengthOfSides the length of each side
*/
public Square(double lengthOfSides) {
super(ANGLES_SUM, lengthOfSides, lengthOfSides, lengthOfSides, lengthOfSides);
this.lengthOfSides = lengthOfSides;
}
/**
* @return the length of each side
*/
public double getLengthOfSides() {
return lengthOfSides;
}
/**
* @param lengthOfSides the length of each side
*/
public void setLengthOfSides(double lengthOfSides) {
this.lengthOfSides = lengthOfSides;
super.setSideA(lengthOfSides);
super.setSideB(lengthOfSides);
super.setSideC(lengthOfSides);
super.setSideD(lengthOfSides);
}
}
這被認爲是不好的做法?這是爲了一個大學的作業,她沒有具體說明她在找什麼。如果我不使用Square中的Quadrilateral中的任何東西,那麼擴展類Quadrilateral似乎是無用的。
是的,這通常被認爲是不好的做法 - 但它有點爭議。問題的關鍵在於,如果你有一個Square實例並且調用mySquare.setSideA(newLength),將發生以下兩件事之一 - 或者你的方塊的邊長與其他邊的長度不一樣,或者邊B,C而D將「神奇地」設置爲其他值。我聽說要解決這個問題的經驗法則是,「平方值」(或不變的正方形)是「IS-A」四邊形值,但是「平方變量」(或可變正方形)不是IS-A四邊形變量。 –
如果四邊形只有(抽象的)'getSide {N}'方法 - 但沒有'sideN'字段或設置器 - 那麼這將不是一個問題,因爲矩形/矩形不變量將被子類型中適當的'整形器'和'getSide {N}'訪問器將被適當地實現..但是如果它是抽象的,那麼不能創建一個真正的四邊形。 – user2864740
那麼最好是隻覆蓋Square和Rectangle中的區域和邊界,而不是真的使用四邊形實例變量?我相信這個任務的目標是學習繼承和封裝,但這似乎不是學習它的最好例子。 –