• 沒有找到結果。

5. 繼承

N/A
N/A
Protected

Academic year: 2022

Share "5. 繼承 "

Copied!
25
0
0

加載中.... (立即查看全文)

全文

(1)

5. 繼承

5.1

類別的繼承

(1). 繼承基本觀念

„ 基本性質

¾ 主要是提供使用者利用已建立好的 class 繼續發展功能相似的 class。

¾ 所繼承的 class 稱為 derived class

¾ 原來的 class 稱為 base class

¾ derive class 可使用原先 base class 內 public attribute 及 public member function

„ 宣告方式(Definition)

class NewCT2 extends CT2 { ...

}

¾ NewCT2 為新 class 的名稱。

¾ CT2 為 base class 的名稱。

¾ 操作方式(Implimentation)和一般的 class 方式相同。

¾ Derive Class 會具有原來 base class 內的 attributes & member function。

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public void init() {a1 = 0;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extends CT1 { } public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

CT2 ct2 = new CT2();

ct1.init();

ct2.init();

ct1.add(2);

ct2.add(3);

System.out.println( ct1.getVar() + ct2.getVar() );

} } Ans: 5

(2)

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public void init() {a1 = 1;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extends CT1 { }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

CT2 ct2 = new CT2();

ct1.init();

ct2.init();

ct1.add(5);

ct2.add(ct1.getVar());

System.out.println( ct2.getVar() );

} } Ans: 7

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; } }

class CT2 { int a1;

public CT2() {a1 = 3;}

public void add(int v1){ a1 = a1 * v1; } }

class CT3 extends CT2 {

public void sub(int v1){ a1 = a1 - v1; } public int getVar(){ return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(2);

System.out.println( ct1.getVar() );

}

(3)

} Ans: 6

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 3;}

public void add(int v1){ a1 = a1 + v1; } }

class CT2 { int a1;

public CT2() {a1 = 4;}

public void add(int v1){ a1 = a1 * v1; } }

class CT3 extends CT2 { public int sub(int v1){

a1 = a1 - v1;

return a1;

}

public int getVar(){ return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(ct1.sub(1));

System.out.println( ct1.getVar() );

} } Ans: 9

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public int add(int v1){

a1 = a1 + v1;

return a1+1;

} }

class CT2 { int a1;

public CT2() {a1 = 3;}

public int add(int v1){

a1 = a1 * v1;

(4)

return a1+2;

} }

class CT3 extends CT2 {

public void sub(int v1){ a1 = a1 - v1; } public int getVar(){ return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.sub(ct1.add(2));

System.out.println( ct1.getVar() );

} } Ans: -2

„ 練習:

已知有一個貨品的類別(Product)如下所示:

則請依下面的貨品特性來繼承 Product 以實作出符合的貨品類別

¾ 貨品為牛奶(Milk),

屬性:

int Vdays // 保存天數 String Place // 生產地 實作的方法:

int getVdays() // 取得保存天數 String getPlace() // 取得生產地

¾ 簽字筆 (Marker) 屬性:

String Color; // 深淺 String Size; // 粗細 - int ID (貨號)

- String Name (品名) - int InPrice (進價) - int OutPrice (售價) - int Amount (庫存) Product

+ Product(int,String,int,int,String) +int getID()(取得ID)

+String getName() (取得Name) + int getInPrice( ) (取得InPrice) + int getOutPrice( ) (取得OutPrice)

(5)

實作的方法:

String getColor() // 取得深淺 String getSize() // 取得粗細

„ 練習:

實作貨品客戶類別(Customer)管理程式

¾ 需要提供相關的功能 (1) 人員新增

(2) 人員查詢

„ 練習:

(2). 覆蓋 (Overriding)

„ 簡介

¾ 對於 base class 內的 Function 若感到不滿意, 則可使用 Overriding 的方式改寫

¾ 則所使用的函數將會以新的為主。

„ 宣告及使用方式 class ct2 {

public int add1(int v){ return v+1; } }

class ct9 extends ct2 {

public int add1(int v){return v+10; } }

public class HelloWorld {

public static void main(String[] args) { ct9 ct91 = new ct9();

System.out.println( ct91.add1(1) ); // 11 }

}

¾ 本例中 ct9 繼承自 ct2 - int ID (編號)

- String Name (姓名) - String Tel (電話) - String Addr (地址) Customer

+ Customer ()

+ Customer (int,String,String,String) + int getID( ) (取得ID)

+ String getName( ) (取得Name) + String getTel( ) (取得Tel) +String getAddr( ) (取得Addr)

(6)

¾ ct2 中宣告並 Implement Function : add1(int);

¾ ct9 中將 add1(int)重新改寫。

¾ 所以在 main 中會呼叫到 ct9.add1(int)

¾ 若想要叫用原來 base class 中的 member function, 可用下面的方式。

super.add1(2) 

¾ base class 內的 attributes 也可以相同的方式呼叫。

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extends CT1 {

public void add(float v1){ a1 = (int)(a1 * v1); } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

CT2 ct2 = new CT2() ; ct1.add(3);

ct2.add(ct1.getVar());

System.out.println( ct2.getVar() );

} } Ans: 7

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public void init() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extends CT1 {

public void add(int v1, int v2){ a1 = a1 * v1; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

CT2 ct2 = new CT2();

(7)

ct1.init();

ct2.init();

ct1.add(2);

ct2.add(ct1.getVar(), 2);

System.out.println( ct2.getVar() );

} } Ans: 8

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; } }

class CT2 { int a1;

public CT2() {a1 = 3;}

public void add(int v1){ a1 = a1 - v1; } }

class CT3 extends CT2 {

public void add(int v1){ a1 = (int)(a1 * v1); } public int getVar(){ return a1; }

}

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(3);

System.out.println( ct1.getVar() );

} } Ans: 9

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extends CT1{

int a1;

public CT2() {a1 = 3;}

public void add(int v1){ a1 = a1 - v1; } }

class CT3 extends CT2 {

(8)

public CT3() {a1 = 4;}

public void add(int v1){ a1 = (int)(a1 * v1); } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(3);

System.out.println( ct1.getVar() );

} } Ans: 12

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 3;}

public void add(int v1){ a1 = a1 + v1; } public int getVar(){ return a1; } }

class CT2 extedns CT1{

int a1;

public CT2() {a1 = 4;}

public void add(long v1){ a1 = a1 - v1; } }

class CT3 extedns CT2 { public CT3() {a1 = 5;}

public void add(float v1){ a1 = (int)(a1 * v1); } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

int v1 = 3;

ct1.add(v1);

System.out.println( ct1.getVar() );

} } Ans: 15

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = (int)(a1 + v1); } public int getVar(){ return a1; }

}

(9)

class CT2 extends CT1{

int a1;

public CT2() {a1 = 3;}

public void add(long v1){ a1 = (int)(a1 - v1); } }

class CT3 extends CT2 { public void CT3() {a1 = 4;}

public void add(float v1, int v2){ a1 = (int)(a1 * v1); } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

int v1 = 3;

ct1.add(v1);

System.out.println( ct1.getVar() );

} }

Ans: 3

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 3;}

public void add(int v1){ a1 = a1 * v1; } }

class CT2 extends CT1 { String a1;

CT2() { a1 = "";}

void sub(int v1){ a1 = "CT3"; } }

public class HelloWorld {

public static void main(String[] args) { CT2 ct1 = new CT2();

ct1.add(2);

System.out.println( "a" + ct1.getVar() );

} } Ans: a

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 2;}

public void add(int v1){ a1 = a1 + v1; }

(10)

}

class CT2 { int a1;

public CT2() {a1 = 3;}

public void add(int v1){ a1 = a1 * v1; } }

class CT3 extends CT2 { String a1;

public CT3() { a1 = "";}

public void sub(int v1){ a1 = a1 - v1; } public String getVar(){ return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(2);

System.out.println( ct1.getVar() );

} }

Ans: CT3 內的 public void sub(int v1){ a1 = a1 - v1; }錯誤 因為 a1(String)與 v1(int)無法減

„ 練習

(3). 繼承的特性

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 1;}

public void add(int v1){ a1 = a1 + v1; } }

class CT3 extends CT1 { public CT3() {a1 = 3;}

}

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(2);

System.out.println(ct1.getVar() );

} } Ans: 5

„ 範例

(11)

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 1;}

public void add(int v1){ a1 = a1 + v1; } }

class CT3 extends CT1 { public CT3() {a1 = 3;}

public int sub(int v1) {return (a1-v1);}

}

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.add(2);

System.out.println( ct1.sub(1) );

} } Ans: 4

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { int a1;

public CT1() {a1 = 1;}

public void add(int v1){ a1 = a1 + v1; } }

class CT3 extends CT1 { public CT3() {a1 = 3;}

public int sub(int v1) {return (a1-v1);}

public String getVar(){ return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT3 ct1 = new CT3();

ct1.sub(1);

System.out.println(ct1.sub(1) + ct1.getVar() );

} }

Ans: String getVar()錯誤,因為 a1 為 int

„ 使用 Parent 的方法 Super

(12)

5.2

共享變數 (Static)

(1). 靜態變數 (Static Variable)

„ 主要功能

¾ 提供同一個類別的所有物件(instances)共用同一個變數

¾ 同一類別的物件執行時所佔用的 Memory 為固定的。

注意: 不同類別的 static 變數會占不同的 Memory

„ 使用方式(Definition) class CT1 {

public static int Y;

public CT1(int tmpY){

Y = tmpY;

}

public int getVar() {return Y; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1);

CT1 ct2 = new CT1(2);

System.out.println( ct1.getVar() );

} }

¾ 則會印出 2

¾ 因為 ct1 的 Y 已經被 ct2 更改過了

¾ 靜態變數的存取則可以透過類別名稱直接存取 例如:

CT1.Y = 5;

(但此時 Y 需要宣告為 public 才可以存取)

„ Static 變數的初始

¾ 使用 static {}的區塊 class CT1 {

public static int a1;

… static { a1 = 0;

} … }

¾ 則在第一次使用變數前會對 a1 進行初始設定初值

(13)

¾ 例如:

int a = CT1.a1;

¾ 在 static 區塊內不可以使用非 static 的變數

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { static int a1;

int a2;

public CT1(int v1, int v2){

a1 = v1;

a2 = v2;

}

public int getVar() {return a1+a2; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1,2);

CT1 ct2 = new CT1(3,4);

System.out.println( ct1.getVar() + ct2.getVar() );

} }

Ans: 12

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int a1;

public int a2;

public CT1(int v1, int v2){

a1 = v1;

a2 = v2;

}

public int getVar() {return a1+a2; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1,2);

CT1 ct2 = new CT1(3,4);

ct1.a2 = 5;

CT1.a1 = 7;

System.out.println( ct1.getVar() + ct2.getVar() );

} } Ans: 23

(14)

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int a1;

public int a2;

public CT1(int v1, int v2){

a1 = v1;

a2 = v2;

}

public int getVar() {return a1+a2; } }

class CT2 {

public static int a1;

public int a2;

public CT2(int v1, int v2){

a1 = v1;

a2 = v2;

}

public int getVar() {return a1+a2; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1,2);

CT2 ct2 = new CT2(3,4);

ct1.a2 = 5;

CT2.a1 = 7;

System.out.println( ct1.getVar() + ct2.getVar() );

} }

Ans: 17 (因為 CT1 的 a1 與 CT2 的 a1 會占不同的 Memory)

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int a1;

public int a2;

public CT1(int v1, int v2){

a1 = v1;

a2 = v2;

}

static {a1 = 5;}

public int getVar() {return a1+a2; } }

class CT2 {

public static int a1;

(15)

public CT2(int v1){ a1 = v1; } static {a1 = 5;}

public int getVar() {return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1,2);

int a = CT2.a1;

System.out.println( ct1.getVar() );

} } Ans: 3

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int a1;

public int a2;

public CT1(int v1, int v2){

a1 = v1;

a2 = v2;

}

static {a1 = 5;}

public int getVar() {return a1+a2; } }

class CT2 {

public static int a1;

public CT2(int v1){ a1 = v1; } static {a1 = 5;}

public int getVar() {return a1; } }

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1(1,2);

System.out.println( ct1.getVar() + CT2.a1);

} } Ans: 8

(2). 靜態函式 (Static Function)

„ 主要功能

¾ 提供程式直接叫用 Member Function。

¾ 執行時所佔用的 Memory 為固定的。

¾ 使用前不需要先宣告

(16)

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int add(int v1, int v2){return v1+v2;}

public static int sub(int v1, int v2){return v1-v2; } }

public class HelloWorld {

public static void main(String[] args) { int a = 13;

int b = 12;

System.out.println( CT1.add(a,b) );

} } Ans: 25

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public int add(int v1, int v2){return v1+v2;}

}

public class HelloWorld {

public static void main(String[] args) { int a = 13;

int b = 12;

System.out.println( CT1.add(a,b) );

} }

Ans: int add(int v1, int v2){return v1+v2;}錯誤,須要宣告為 public static int add(…)

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 {

public static int add(int v1, int v2){return v1+v2;}

public static int sub(int v1, int v2){return v1-v2; }

public static float area(float r1){return (float)(r1*r1*3.1); } }

public class HelloWorld {

public static void main(String[] args) { int a = 3;

int b = CT1.add(a, 2);

float c = CT1.sub(b, 3);

System.out.println( CT1.area(c) );

} }

Ans: 12.4

(17)

„ 練習:

已知有一個靜態函式如下所示:

class myUtil {

public static int findMax(int [] arr){

… }

public static int findMin(int [] arr) { …

} }

(3). 常數 (final)

„ 主要功能

¾ 執行時需要於 constructor 中宣告初值 (或是宣告時直接指定)

¾ 不可改變內容

„ 範例

(4). 虛擬函式(Virtual Function)– Abstract Function

„ 主要功能

¾ virtual function 為 member function 的一種。

¾ virtual function 所產生的 Object 並不是原先所宣告的 class,而是執行時的 class

¾ Java 中除了 static function 以外皆可為 virtual function

„ 使用方式 (Definition) class Vir {

public void A(){…}

}

class VirA {

public void A() {…}

}

class VirB {

public void A() {… } }

¾ Usage

Vir a = new VirA();

a.A(); // 會叫到 VirA 的 A a = new VirB();

a.A(); // 會叫到 VirB 的 A

„ 使用時機

¾ 使用相同介面對多個 class 進行作業時。

(18)

¾ 方便對 class 進行擴充。

¾ 操作的 class 只有在執行才能決定時。

„ Example : Virtual Function (ex.virtual_func) 使用 Virtual Function 的方式來執行排序作業。

並將排序結果顯示出來。

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { public int a1;

CT1(){a1 = 10;}

public void f1(int v1){a1 = a1 + v1;}

}

class CT2 extends CT1{

public void f1(int v1){a1 = a1 - v1;}

}

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

CT1 ct2 = new CT2();

ct1.f1(5);

ct2.f1(5);

System.out.println(ct1.a1 + "," + ct2.a1);

} }

Ans: 15,5

„ 範例

寫出執行結果,若不能執行請指出錯誤的地方與原因。

class CT1 { public int a1;

CT1(){a1 = 10;}

public void f1(int v1){a1 = a1 + v1;}

}

class CT2 extends CT1{

public void f1(int v1){a1 = a1 - v1;}

}

class CT3 extends CT1{

public void f1(int v1){a1 = a1 * v1;}

}

public class HelloWorld {

public static void main(String[] args) { CT1 ct1 = new CT1();

ct1.f1(3);

ct1 = new CT2();

(19)

ct1.f1(3);

ct1 = new CT3();

ct1.f1(3);

System.out.println( ct1.a1);

} } Ans: 30

(5). 抽象函式(Abstract Function)

„ 主要功能

¾ Abstract class 本身可以包含(或不包含)abstract methods

¾ Abstract classes 不可以直接使用(instantiated),但可以繼承(subclassed)

¾ Abstract method 則是宣告為 abstract 的函式,且沒有實作(程式碼)的部分,亦即 沒有 implementation (沒有{ },而是直接為;)

¾ 範例:

public abstract class GraphicObject { // declare fields

// declare non-abstract methods abstract void draw();

}

¾ 若一個 class 內包含有 abstract methods,則他必須要宣告為 abstract

¾ 繼承自 abstract 的 class:

(1) 不為 abstract: 則會進行實作的部分(也就是提供程式碼的部分) (2) 也為 abstract: 則本身也要宣告為 abstract

„ 範例:

寫出執行結果,若不能執行請指出錯誤的地方與原因。

abstract class GraphicObject { int x, y;

void moveTo(int newX, int newY) { x = newX;

y = newY;

}

abstract void draw();

abstract void resize();

}

class Circle extends GraphicObject { void draw() {

System.out.println("draw a circle!");

} }

public class HelloWorld {

public static void main(String[] args) {

(20)

Circle cir = new Circle();

cir.moveTo(100, 200);

cir.draw();

} }

Ans: 錯誤,resize()並未進行實作!

„ 範例:

寫出執行結果,若不能執行請指出錯誤的地方與原因。

abstract class GraphicObject { int x, y;

void moveTo(int newX, int newY) { x = newX;

y = newY;

}

abstract void draw();

abstract void resize();

}

class Circle extends GraphicObject { void draw() {

System.out.println("draw");

}

void resize() {

System.out.println("resize");

} }

public class HelloWorld {

public static void main(String[] args) { Circle cir = new Circle();

cir.moveTo(100, 200);

cir.draw();

} }

Ans: draw

„ 範例:

寫出執行結果,若不能執行請指出錯誤的地方與原因。

abstract class GraphicObject { int x, y;

void moveTo(int newX, int newY) { x = newX;

y = newY;

}

abstract void draw();

abstract void resize();

}

(21)

abstract class Circle extends GraphicObject { void draw() {

System.out.println("draw!");

} }

class BigCircle extends Circle { void resize() {

System.out.println("resize!");

} }

public class HelloWorld {

public static void main(String[] args) { BigCircle cir = new BigCircle();

cir.moveTo(100, 200);

cir.resize();

} }

Ans: resize

(6). Generic Class

„ Type

¾ 移植性

#ifdef i80386L typedef char byte;

typedef char bool;

#endif

#ifdef m6800

typedef signed char byte;

typedef int bool;

#endif

¾ Macro & Abstract

一般的 Function 的傳入值為在 Compile 前已知的 Type。

但是 Macro 可以允許未知的 Type。

#define MAX(x,y) (((x)>(y)) ? (x) : (y))

#define MIN(x,y) (((x)<(y)) ? (x) : (y))   將 Macro 分成兩列寫

#define MAX(x,y)\

(((x)>(y)) ? (x) : (y) )

¾ Default Type Default 為 int max(x,y) { if (x>y)

(22)

return x;

else

return y;

}

在有些編譯器上市不允許上述的使用方式。

„ Abstract

¾ 移植性

#ifdef i80386L

¾ Derived Class Abstract

Function 的傳入值為在 Compile 前已知的 Type。

¾ Generic Class

Function 的傳入值為在 Compile 前已知的 Type。

¾ Template

Function 的傳入值為在 Compile 前已知的 Type。

5.3

綜合練習

(1). 門禁管理程式 (door_control_01)

„ 本練習要撰寫一個門禁管理程式

¾ 撰寫一個處理日期(date)與時間(time)的類別(class) (MyDate),提供下面的功能 (1) 取得目前系統的日期與時間

(2) 輸入任一日期可以與系統日期比較前後

¾ 提供萬年曆來輸入日期的介面

„ 主要功能

¾ 出入口 (Door)

¾ 出入口管制 (DoorAccess) - int doorno;

- char doorname[20];

Door

+Door();

+Door(char *, int);

(23)

¾ 員工資料

¾ 出入口管制記錄

„ 以 ifstream 方式來處理檔案,處理檔案的功能包含查詢、新增、修改與刪除 (1) 人員資料維護

(2) 出入口資料維護 (3) 出入口管制資料維護

(4) 提供萬年曆來輸入日期的介面

„ 檔案處理

¾ 讀出

std::string str1, all;

std::fstream iFile;

iFile.open(tmpfile);

bool retstr = false;

- char door[20]; // 名稱

- int doorno; // 編號

- int perno; // 員工 - int status;

- char date1[9] = "05/06/09"; // 進出時間

DoorRecord

+DoorRecord();

+DoorRecord(char *, int);

- int perno; //編號

- char pname[10] //姓名

Person

+Person();

+Person(char *, int);

- char door[20]; // 名稱

- int doorno; // 編號

- int perno[10]; // 管制員工 - char date1[9] = "05/06/09"; // 管制時間

- char time1[9] = "10:05:00";

DoorAccess

+DoorAccess ();

+DoorAccess (char *, int);

(24)

while(iFile){

getline(iFile,str1);

all = all + str1 +"\n";

}

iFile.close();

¾ 寫入

std::fstream oFile(tmpfile,std::ios::out);

oFile << all;

oFile.close();

„ 以 Class 的方式來實作

¾ 可將檔案處理的功能寫於 class 中

¾ 若要在 Form 中處理 class,則須要先將 class 宣告於.h 的檔案中,再 include

#include "Person.h"

...

(2). 門禁管理程式 (door_control_02)

„ 如練習(1)的個門禁管理程式,提供圖形介面來表示門的開關

¾ 利用 Form 的方式來表示門的開關

¾ 利用文字檔來記錄門的狀態

¾ 可以配合感應卡來驅動(或是用鍵盤)

„ Use Case Diagram

¾ 初步分析

¾ 細部分析

(25)

„ Class Diagram

„ 架構

¾ Proc01.h class Person { …

}

¾ Form01

control Fuunction

„ User Interface

¾ 使用者資料編輯作業 (1) 新增

(2) 修改 (3) 刪除 (4) 查詢

¾ 門禁管理作業 (1) 新增 (2) 修改 (3) 刪除 (4) 查詢

„

參考文獻

相關文件

反之, 有了 parametric equation, 我們可利用這些在 R n 的 direction vectors, 利 用解聯立方程組的方法求出和這些 direction vectors 垂直的 normal vectors,

而利用 row vectors 的方法, 由於可以化為 reduced echelon form, 而 basis 是由此 reduced echelon form 中的 nonzero vectors 所組成, 所以雖然和來的 spanning

We point out that extending the concepts of r-convex and quasi-convex functions to the setting associated with second-order cone, which be- longs to symmetric cones, is not easy

Hence, we have shown the S-duality at the Poisson level for a D3-brane in R-R and NS-NS backgrounds.... Hence, we have shown the S-duality at the Poisson level for a D3-brane in R-R

 依序填入該學生社團負責人之相關資訊,並於下方

135-141; GRETIL - Göttingen Register of Electronic Texts in Indian Languages: (http://gretil.sub.uni- goettingen.de/gretil/1_sanskr/4_rellit/buddh/psp_4u.htm) 英 譯 本 : Edward

有關於 Java 程式語言,下列何者敘述不正確?(A)Java 程式語言透過 extends 提供多重繼承 (Multiple

竊謂嫡室或鮮生育,乃緣 (緣於) 繼續大事 (此指繼承家族 血脈)