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
範例
寫出執行結果,若不能執行請指出錯誤的地方與原因。
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() );
}
} 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;
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)
實作的方法:
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)
¾ 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();
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 {
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; }
}
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; }
}
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
範例
寫出執行結果,若不能執行請指出錯誤的地方與原因。
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
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 進行初始設定初值
¾ 例如:
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
範例
寫出執行結果,若不能執行請指出錯誤的地方與原因。
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;
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 為固定的。
¾ 使用前不需要先宣告
範例
寫出執行結果,若不能執行請指出錯誤的地方與原因。
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
練習:
已知有一個靜態函式如下所示:
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 進行作業時。
¾ 方便對 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();
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) {
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();
}
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)
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);
…
¾ 員工資料
¾ 出入口管制記錄
以 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);
…
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
¾ 初步分析
¾ 細部分析
Class Diagram
架構
¾ Proc01.h class Person { …
}
¾ Form01
control Fuunction
User Interface
¾ 使用者資料編輯作業 (1) 新增
(2) 修改 (3) 刪除 (4) 查詢
¾ 門禁管理作業 (1) 新增 (2) 修改 (3) 刪除 (4) 查詢