2013-10-22 12 views
1

好吧,所以基本上我創建了一個程序,允許用戶選擇一個形狀(三角形,正方形,圓形),然後它接受一個int並計算邊界長度和麪積。關於我的程序和多態性的問題

我這樣做沒有問題,並有一個完美的工作程序。 (https://gist.github.com/anonymous/c63a03c129560a7b7434 4類)但是現在我必須用多態概念來實現這個,並且我正在努力如何去做。

我有什麼,我想,當涉及到繼承

         Main 
             | 
             Shapes 
            /| \ 
           triangle circle square 

做一個基本的想法,但我不明白,我應該如何重寫時三角形/平方米之內的所有方法/圓類是獨一無二的,沒有「抽象」的方法可以繼承「形狀」類。

如果有人可以快速查看我鏈接的代碼並提出一種方法來做到這一點,將不勝感激。

對不起,如果我不好解釋這一點。謝謝。

+0

那麼,他們每個人都有一個類似的構造函數'A(double)'。它們都有共同的方法:'getArea(double)&getBoundaryLength(double)'。如果將所有這些(作爲抽象方法和必需的構造函數)放到抽象類中,它應該可以工作。 – Obicere

+0

getArea和getBoundaryLength絕對可以被抽象。請記住抽象意味着「在兩種不同的事物中找到共同的部分」 – Will

+0

你到底想要什麼?你是否試圖訪問派生類中對特定派生類唯一的方法? – Prateek

回答

1

也許這可能是一個開始:

public abstract class Shape { 
    protected double length; 
    public Shape(double length) { 
     this.length = length; 
    } 
    public abstract double getArea(); 
    public abstract double getBoundaryLength(); 
} 

而一個可能的實現

public class Circle extends Shape { 
    @Override 
    public double getArea() { 
    return length * length * Math.PI; 
    } 
    @Override 
    public double getBoundaryLength() { 
    return 2 * length * Math.PI; 
    } 
} 

在主:

Shape shape = new Circle(scan.nextDouble()); // Use variable of type shape here 

.. 

// this code is the same for all shapes 
double boundaryLength = shape.getBoundaryLength(length); 
double area = shape.getArea(length); 
System.out.println("Boundary Length = " + Math.round(boundaryLength)); 
System.out.println("Area = " + Math.round(area)); 
+0

我想我會這樣做,我真的很感謝你的幫助。如果這是有道理的,我認爲我會以自己的想法混淆視聽。謝謝 :) –

1

我注意到你的形狀對象之間沒有共同的接口。

也許你可以做這樣的事情:

public interface Shape { 
    // whatever polymorphic behavior you want 
} 

,然後每個類的定義應該是這樣的:

public class Circle implements Shape { 
    // ... 
} 

public class Triangle implements Shape { 
    // ... 
} 

public class Square implements Shape { 
    // ... 
} 

+0

非常感謝,但我想我會和micha的答案一起去。感謝您花時間幫助我。 –

+0

當然,祝你好運 – yamafontes

1

這裏的想法是有出現在所有的子類,如形狀的抽象方法的方法。如果你這樣做,你可以使用Shape對象作爲Shapes,而不必知道它們是哪種形狀。例如,你這樣做:

Shape c = new Circle(50); 
System.out.println(c.getArea()); 

這將導致印刷形狀的正確區域,由一個圈來計算,而仍然使用它作爲一個形狀(第二行一無所知的是它的起源創建爲一個圓圈,但仍然會計算爲一個)。這隻能通過繼承的使用來實現。

1

作爲@KepaniHaole提到你可以創建一個接口並讓你的類實現它。 另一種方法是創建一個abstract class,在其中實現三個類之間通用的方法,並且保留其自己的類不常用的方法的實現。

例如:

public abstract class Shape 
{ 
    int x, y; 
    void moveTo(int newX, int newY) 
    { 
     //implementation 
    } 

    abstract void draw(); 
    abstract void resize(); 
} 

所以moveTo可以三個類之間共享,而drawresize可以由每個單獨類實現。

關於abstract classes的好處是您可以在其中甚至字段中實現方法。這是不可能的接口。