聯成電腦技術論壇

 找回密碼
 註冊
搜索
查看: 862|回復: 13

[作業] OO課程作業進行中: Shapes

[複製鏈接]
發表於 2012-9-27 17:00:50 | 顯示全部樓層 |閱讀模式
上次上課老師出的作業。

包括:

Rectangle
Triangle
Circle
Cylinder
Sphere

... 等類別,封裝在一個NetBeans的壓縮檔裡。

等待老師的OO魔法喲!!

Shape Example.zip

17.13 KB, 下載次數: 22

 樓主| 發表於 2012-9-27 20:38:26 | 顯示全部樓層
發現其中的Sphere有小問題, 主要是型別的問題, 修改一下其中的get Volume() method:

    public double getVolume() {
        return 4d / 3 * Math.PI * Math.pow(radius, 3);// 3分之4*圓周率*半徑(radius)3次方
    }
 樓主| 發表於 2012-9-28 00:24:28 | 顯示全部樓層
原來老師是用程式碼的重覆來講解OO。

之前沒有這樣想過,挺有趣的。

我想對於初學的人,這真的是一個挺容易理解的方法。

不過其中也透露出了一點OO的複雜程度,例如當規劃父類別時,只有部份共通的部份要不要劃進去的問題。

我想最後還是得回歸OO的原始精神吧!!
 樓主| 發表於 2012-9-28 00:57:07 | 顯示全部樓層
[i=s] 本帖最後由 ccyvision 於 2012-9-28 00:58 編輯 [/i]

回來試了一下,把老師的主程式修改成下面這樣,可以動喲,挺好玩的:

package com.polymorphism.sl100.shapes;

public class Main2 {

   public static void main(String[] args) {
       Shape[] a = new Shape[5];
       a[0] = new Rectangle("長方形1", 10, 5);
       a[1] = new Circle("圓形1", 9);
       a[2] = new Triangle("三角形1", 5, 5, 8);
       a[3] = new Cylinder("圓柱體1", 7, 13);
       a[4] = new Sphere("球體", 7);

       for (int i=0; i<a.length; i++) {
           a[i].printArea();
           if (a[i].getType().equals(Sphere.TYPE) || a[i].getType().equals(Cylinder.TYPE)) {
               ((Shape3D)a[i]).printVolume();
           }
       }
   }
}
 樓主| 發表於 2012-9-28 01:03:12 | 顯示全部樓層
上面的程式碼背後有這樣的繼承關係:

abstract Shape

Circle extends Shape
Triangle extends Shape
Rectangle extends Shape

abstract Shape3D extends Shape
Cylinder extends Shape3D
Sphere extends Shape3D
 樓主| 發表於 2012-9-28 01:04:43 | 顯示全部樓層
不過我把上課寫的又加了幾筆進去。父類別Shape的樣子於是變成:

abstract public class Shape {

    private String name;
    private String type;  // 能辨別形狀的種類

    public Shape(String name, String type) {
        setName(name);
        setType(type);
        System.out.println("A Shape named " + this.getName() + " has been initiated.");
    }

    public String getName() {
        return this.getType() + "[" + name + "]";  // 名稱前面自動加上形狀類別
    }

    public void setName(String name) {
        this.name = name;

    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    abstract public double getArea();

    public void printArea() {
        System.out.println(this.getName() + " 的面積為 " + getArea());
    }
}
 樓主| 發表於 2012-9-28 01:05:25 | 顯示全部樓層
所以執行結果就變成這樣了:

A Shape named Rectangle[長方形1] has been initiated.
A Shape named Circle[圓形1] has been initiated.
A Shape named Triangle[三角形1] has been initiated.
A Shape named Cylinder[圓柱體1] has been initiated.
A Shape named Sphere[球體] has been initiated.
Rectangle[長方形1] 的面積為 50.0
Circle[圓形1] 的面積為 254.46900494077323
Triangle[三角形1] 的面積為 12.0
Cylinder[圓柱體1] 的表面積為 879.645943005142
Cylinder[圓柱體1] 的體積為 2001.1945203366984
Sphere[球體] 的表面積為 87.96459430051421
Sphere[球體] 的體積為 1436.7550402417319
 樓主| 發表於 2012-9-28 01:07:23 | 顯示全部樓層
具有實作的子類別也有修改,主要是加上TYPE常數。

以下舉Rectangle類別做例子:

public class Rectangle extends Shape {

    private double length, width;
    public final static String TYPE = "Rectangle";

    public Rectangle(String name, double length, double width) {
        super(name, TYPE);
        this.setLength(length);
        this.setWidth(width);
    }

    public double getArea() {
        return length * width;
    }

    public double getLength() {
        return this.length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return this.width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
}
頭像被屏蔽
發表於 2012-9-28 01:53:22 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
頭像被屏蔽
發表於 2012-9-28 02:02:51 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



小黑屋|Archiver|手機版|聯成電腦技術論壇  

GMT+8, 2019-10-23 18:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表