1、問題:形狀的面積,王豐緒 銘傳大學資訊工程學系,問題基本資訊,標題 具有計算面積能力的形狀 問題描述 給一個形狀 ( 可能是正方形、長方形或圓形 ) 以及相關資料,請問面積是 ? 目的 讓同學練習多類別的設計(透過繼承與抽象類別,別多型),並轉換成物件模型與JAVA Code版本:2011/07/28 提示 請以UML圖型繪製本問題的物件模型 以JAVA實作程式,問題分析:掌握領域知識,給一個形狀(含正方形、長方形及圓形)以及相關資料,請問面積是? 學習單1:請同學整理相關領域知識,面積?,物件模型,學習單2:請同學根據問題描述,尋找適當的物件模型 給一個形狀(可能是正方形、長方形或圓形)以及
2、相關資料,請問面積是? 名詞 形狀: 正方形:Square 長方形:Rectangle 圓形:Circle 邊長、半徑、面積:類別的成員 類別之間的關係:運用歸納能力,繼承,繼承,繼承,Shape類別,抽象類別 不能產生物件 (沒有具體足夠的資訊) 資料成員 面積:protected double area (任何的形狀都有面積) 功能成員 public void computeArea():計算面積(抽象動作) public double getArea():取得形狀的面積 (具體動作) public void printArea():顯示形狀的面積 (具體動作),Rectangle類別,繼
3、承Shape類別 繼承相關的屬性和動作 (protected, public) 資料成員 邊長:protected double sideX 邊長: protected double sideY 功能成員 實作public void computeArea():計算長方形的面積 public void setSideLength(double x, double y) :設定新的邊長,Square類別,繼承Rectangle類別 資料成員 無 功能成員 public Square(double n):建立特定的正方形(建構元) public void setSideLength(double
4、l) :設定新的邊長,Circle類別,繼承Shape類別 資料成員 半徑:radius 功能成員 實作public void computeArea():計算圓形的面積 public Circle(double r):建立特定的圓形(建構元) public void setRadius(double r) :設定新的半徑,學習單3: JAVA Code,學習任務,請利用BlueJ撰寫本問題的JAVA Code,並且進行測試,Shape類別,public abstract class Shape protected double area;abstract public void comput
5、eArea();public double getArea()return area;public void printArea()System.out.println(“Area is:“ + area); ,定義抽象類別,定義抽象動作,Rectangle類別,public class Rectangle extends Shape protected double side_X , side_Y;public Rectangle()side_X = 0; side_Y=0 ;public Rectangle(double x, double y) side_X = x ; side_Y =
6、 y;public void computeArea() area = side_X * side_Y ;public void setSideLength(double x, double y) side_X = x ; side_Y=y;,繼承類別,Square類別,public class Square extends Rectangle public Square(double n) side_X = n ; side_Y= n;public void setSideLength(double l) side_X= l ; side_Y = l; ,Circle類別,public cl
7、ass Circle extends Shape private double radius;final private double PI = 3.414; public Circle()radius = 0;public Circle(double r) radius = r ;public void computeArea() area = Math.pow(radius,2.0)*PI;public void setRadius(double r) radius = r ; ,類別多型,特過類別繼承階層,一個物件變數可以指到不同的類別,Shape s ; s = new Rectang
8、le(2, 2); puteArea(); s.printArea();s = new Square(2); puteArea(); s.printArea();s = new Circle(2); puteArea(); s.printArea();,反思(1/3),學習單4:請同學進行學習反思,你從此問題學到什麼? 本次練習,你覺得設計一個類別需要考慮到? 抽象類別 與其他類別的關係 本次練習,你覺得類別的建立有哪些策略? 從名詞找類別 根據領域知識定義類別與資料成員 根據領域知識定義類別的方法成員 根據領域知識定義類別之間的關係,反思(2/3),請同學進行學習反思,你從此問題學到什麼?
9、本次練習,你覺得JAVA有哪些特性可以支援物件導向程式設計? 何謂抽象類別? 方法的覆載(overloading),反思(3/3),請同學進行學習反思,你從此問題學到什麼? 本次練習,你覺得物件導向程式有哪些不錯的測試策略與技巧? 本次練習,你覺得物件導向設計具有哪些優點?(以本問題為例,舉例具體說明) 透過繼承簡化系統複雜度 更清晰的問題模式與自然的計算邏輯 容易測試與維護,延伸學習,請同學列舉其它與本問題相關的學習 類別的繼承關係為何 何謂抽象類別,抽象方法 請同學就本次學習的結果,設計測驗題目,抽象類別與方法,抽象類別 具有共用的資料與方法成員 不能實際產生物件,方法的覆載(Overloading),子類別的方法可以覆載父類別的相同名稱的方法,