2014-01-05 133 views
0

由於我想了解更多關於OOP(Java)的知識,我正在通過一些找到這個'任務'的文獻工作。不幸的是,由於我對OOP相當陌生,而且我沒有任何樣本解決方案,所以我遇到了很多困難。也許你們中的一些人可以給我一些輸入,所以可以通過我的方式工作。OOP任務(類層次結構,繼承,接口等)


  1. 定義一個類層次結構這些類:
    • 四邊形
    • 凸四邊形
    • 梯形
    • 平行四邊形
    • 菱形
    • 矩形
  2. 創建每個類別中,如果可能的
  3. 的實例定義合理的屬性和方法,每個類
  4. Overload和Override的方法
  5. 撰寫合理的構造爲每個類
  6. 使用的調節器(抽象,靜態,最終,公共,受保護和私有)
  7. 接口如何用於此任務?

01類層次結構

好吧,這是簡單的數學,你可以在四邊形的層次結構可以找到大量的信息隨處可見。下面是我做的:

enter image description here


創建每個類的對象也沒什麼大不了的,但我仍然有一些問題了解所有的面嚮對象的技術。有一些地方我不知道什麼是更好的方法來做到這一點......(例如,從兩個類繼承的平方,這在java中是不可能的)。另外,無論如何,公式(比如計算表面積)會一直被覆蓋(因爲它們大多數時間不同),所以爲什麼我需要繼承?我不能只使用一個接口,在所有這些類中使用它迫使它們實現這些公式?

問候 - 狐狸座

+0

也許是'Shape'接口。 –

+0

如果不知道班級的目的,你無法決定繼承鏈 - 這是責任。什麼是四邊形?什麼是方形的?而且你當然不需要接口,因爲當一個簡單的抽象類足夠時它們不應該被使用。 – spectre

回答

1

在現實生活中,你可能會更好使用的接口。像這樣的深層繼承結構常常被忽視;通常認爲'偏好合成而不是繼承'(http://en.wikipedia.org/wiki/Composition_over_inheritance)。例如,你可能有一個定義「表面積」和「周長」的「四邊形」界面,然後讓其他形狀滿足該界面。

然而,如果這是一個家庭作業問題,那麼您應該根據您的教科書/教師以前提供的任何示例來建立課程層次結構。這不是關於設計強大的軟件,而是爲了向老師證明你學會了如何以他們認爲應該做的事情做事。

1

抽象類作爲中等複雜層次結構的基礎並不像接口那麼靈活。一個類 - 抽象與否 - 強制執行特定類型。

想都沒想太辛苦一下吧,這裏有一個方法來啓動:

public interface Quadrilateral { 
    int getTopMillimeters(); 
    int getLeftMillimeters(); 
    int getRightMillimeters(); 
    int getBottomMillimeters(); 
} 

從這個原始數據,你也可以定義

getTopLeftAngle(),getTopRightAngle(),...

這將根據長度計算它們的值。

我也會強調構圖而不是繼承。最終效果確實可能是一個複雜的繼承結構。

對我來說,構圖是「Composer」類的層次結構,它不實現接口。如

public class QuadrilateralComposer { 
    private final int iTopMM; 
    private final int iBtmMM; 
    ... 
    public QuadrilateralComposer(int i_topMM, int i_bottomMM, ...) { 
     if(i_topMM < 1) { 
     throw new IllegalArgumentException... 
     } 
     if(i_bottomMM < 1) { 
     throw new IllegalArgumentException... 
     } 
     ... 
     iTopMM = i_topMM; 
     iBtmMM = i_bottomMM; 
     ... 
    } 
    public int getTopMillimeters() { 
     return iTopMM; 
    } 
    ... 

,然後由一個抽象類組成:

public class AbstractQuadrilateral implements Quadrilateral 
    private final QuadrilateralComposer qc; 
    public AbstractQuadrilateral(int i_topLen, int i_bottomLen, ...) { 
     gc = new QuadrilateralComposer(i_topLen, i_bottomLen, ...); 
    } 
    public int getTopLength() { 
     return gc.getTopLength(); 
    } 
    ... 

抽象類從來沒有擴展其它抽象類,他們只用內部作曲家(實際上是實現接口)。另一方面,作曲家只擴展作曲家,並在內部使用其他作曲家。

(三題:保護功能在作曲家public function_4prot()protected function(),它調用_4prot版本有時抽象類確實可以實現該接口的一切都實現在這種情況下,這將是混凝土[。非抽象的],並命名爲「SimpleXYZ」,而不是「AbstractXYZ」。最後,靜態工具函數駐留在Composer中。)

如果EVERY接口是這樣設計的,那麼ANY類可以很容易地實現ANY接口,無論他們必須實際擴展哪一類。如果抽象類擴展了其他抽象類,對於需要實現接口的類來說,這是更多的工作,但是碰巧並且不得不擴展其他的東西。

這不是你問的問題,但是學習這個概念更好地改變了我的代碼。看到它在接受的答案中提到,讓我想到了所有這一切。在過去的幾年中,我實際上已經慢慢地從繼承轉變爲構圖,並且在閱讀Effective Java之後,它就像是繼承棺材中的最後一顆釘子。

+0

你說最終效果可能是一個複雜的繼承結構,那爲什麼呢?我不會創建一個接口,作曲家(作爲抽象類),然後創建每個形狀的類並從該抽象類繼承。 – Vulpecula

+0

你說「作曲家是一個抽象類」。你的意思是「和」? 「as」將是不正確的。一般來說,每種類型都有一個作曲家,一個抽象類和一個具體類。但是,由於您的作業中的類型可能會通過一個或兩個簡單的參數來區分,您可能會用較少的「後端」類(作曲家和摘要)逃脫。我不確定我是否回答了您的問題。 – aliteralmind

+0

是的,我寫了AS而不是AND ...對不起。 – Vulpecula

0

好的,現在的計劃是我試圖解決這個沒有任何接口第一。所以這裏是繼承圖:

我忽略了這個事實,即廣場不僅是一個直角,而且是一個菱形。

抽象類(四邊形)將定義(但不實現)計算'表面積'和'周長'的方法。覆蓋方法很簡單,因爲每個形狀的計算都有不同的形式,但我不確定我可以在哪裏使用重載功能。


還有一件事:使用接口,這將是所需的方式?

enter image description here