23
1 物物物物物物物物物 物物物物物物物物物 鄭鄭鄭 鄭鄭鄭 鄭鄭鄭鄭鄭鄭 鄭鄭鄭鄭鄭鄭 鄭鄭鄭鄭鄭鄭 鄭鄭鄭鄭鄭鄭 / / 鄭鄭鄭鄭鄭鄭鄭 鄭鄭鄭鄭鄭鄭鄭 / / 鄭鄭鄭鄭鄭鄭鄭 鄭鄭鄭 鄭鄭鄭鄭鄭鄭鄭 鄭鄭鄭

1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

Embed Size (px)

Citation preview

Page 1: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

1

物件與類別補充說明物件與類別補充說明

鄭士康鄭士康國立台灣大學國立台灣大學

電機工程學系電機工程學系 //電信工程研究所電信工程研究所 //資訊網路與多媒體研究所資訊網路與多媒體研究所

Page 2: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

2

物件與類別物件與類別• 物件物件 (Object)(Object)

– 狀態與功能:例如狀態與功能:例如 , , 撲克牌撲克牌♦♦ 10 10

• 類別類別 (Class)(Class)– 藍圖:例如藍圖:例如 , , 泛稱撲克牌泛稱撲克牌– 狀態:變數狀態:變數 (Variables) [(Variables) [ 資料成員,資料成員, Data Data

membermember ,, FieldField ,, Attribute](Attribute]( 花色花色 , , 點數點數 ))– 功能:函式功能:函式 (Function) [(Function) [ 方法成員,方法成員, Member Member

functionfunction ,, MethodMethod ,, OperationOperation ,, ResponsibiResponsibilities]lities]

(( 設定或告知花色與點數設定或告知花色與點數 ))

Page 3: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

3

封裝封裝 (Encapsulation)(Encapsulation)

• 類別將狀態變數與功能函式封裝起來類別將狀態變數與功能函式封裝起來• 通常狀態變數為私有通常狀態變數為私有 (private) (private) ,只供同類,只供同類

別之功能函式取用,不可以由類別外直接取用別之功能函式取用,不可以由類別外直接取用– 避開同名變數問題避開同名變數問題– 避免被不慎改動,破壞狀態的正確一致性避免被不慎改動,破壞狀態的正確一致性– 容易維護,不影響外界程式容易維護,不影響外界程式

• 功能函式可能公用功能函式可能公用 (public) (public) ,也可能私有,也可能私有• 一類別至少有一公用函式,以便應用一類別至少有一公用函式,以便應用

Page 4: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

4

類別 類別 CardCard

Page 5: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

5

CardDemo.Program (1/2)CardDemo.Program (1/2)/*/* * * 以撲克牌類別說明類別與物件的概念以撲克牌類別說明類別與物件的概念 * 3/14/2009* 3/14/2009 */*/

using System;using System;

namespace CardDemonamespace CardDemo{{ class Programclass Program {{ static void Main(string[] args)static void Main(string[] args) {{

Page 6: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

6

CardDemo.Program (2/2)CardDemo.Program (2/2)

Card diCard diaamond_10 = new Card();mond_10 = new Card(); didiaamond_10.SetSuit('d');mond_10.SetSuit('d'); didiaamond_10.SetRank(10);mond_10.SetRank(10); char suit = char suit = didiaamond_10.GetSuit();mond_10.GetSuit();

int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank(); Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}",

didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

}} }}}}

Page 7: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

7

CardDemo.Card (1/3)CardDemo.Card (1/3)

/*/* * * 模擬一張撲克牌模擬一張撲克牌 * 3/14/2009* 3/14/2009 */*/using System;using System;namespace CardDemonamespace CardDemo{{ class Cardclass Card {{ private char suit;private char suit; private int rank;private int rank;

Page 8: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

8

CardDemo.Card (2/3)CardDemo.Card (2/3)

public void SetSuit(char s)public void SetSuit(char s) {{ suit = s;suit = s; }} public void SetRank(int r)public void SetRank(int r) {{ rank = r;rank = r; }}

Page 9: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

9

CardDemo.Card (3/3)CardDemo.Card (3/3)

public char GetSuit()public char GetSuit() {{ return suit;return suit; }} public int GetRank()public int GetRank() {{ return rank;return rank; }} }}}}

Page 10: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

10

程式追蹤程式追蹤 (1/6)(1/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main() Diamond_10

suit

rank

diamond_10

class Cardclass Card{{ private char suit;private char suit; private int rank;private int rank; . . .. . .}}

Page 11: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

11

程式追蹤程式追蹤 (2/6)(2/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main()

diamond_10

suit

rank

diamond_10

‘d’

class Cardclass Card{{ . . .. . . public void SetSuit(char s)public void SetSuit(char s) {{ suit = s;suit = s; }} . . .. . .}}

Page 12: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

12

函式參數函式參數• 參數參數 (Parameters, (Parameters, 或稱引數 或稱引數

Arguments)Arguments)– 形式參數形式參數 (Formal Parameters)(Formal Parameters)– 真實參數真實參數 (Actual Parameters)(Actual Parameters)

Page 13: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

13

記憶配置記憶配置

真實參數’ d’

形式參數 s

Main

SetSuit

diamond_10suit

rank

Program

Page 14: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

14

static void Main(string[] static void Main(string[] args)args){{ . . .. . .

函式呼叫流程函式呼叫流程

dimond_10.SetSuit( ‘d’ );

class Card { private suit; . . . public void SetSuit( char s ) { suit = s; } . . .}

}

Page 15: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

15

程式追蹤程式追蹤 (3/6)(3/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main()

diamond_10

suit

rank

diamond_10

‘d’

10

class Cardclass Card{{ . . .. . . public void SetRank(int r)public void SetRank(int r) {{ rank = r;rank = r; }} . . .. . .}}

Page 16: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

16

程式追蹤程式追蹤 (4/6)(4/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main()

diamond_10

suit

rank

diamond_10

‘d’

10

suit ‘d’

class Cardclass Card{{ . . .. . . public char GetSuit()public char GetSuit() {{ return suit;return suit; }} . . .. . .}}

Page 17: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

17

函式傳回值函式傳回值

Main

suit

GetSuit

傳回值

suit

rank

diamond_10

Program

Page 18: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

18

函式呼叫流程函式呼叫流程

char suit = dimond_10.GetSuit();char suit = dimond_10.GetSuit();

static void Main(string[] args)static void Main(string[] args){{

}}

. . .

class Card { private suit; . . . public char GetSuit() { return suit; } . . .}

Page 19: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

19

程式追蹤程式追蹤 (5/6)(5/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main()

diamond_10

suit

rank

diamond_10

‘d’

10

suit ‘d’

rank 10

class Cardclass Card{{ . . .. . . public int GetRank()public int GetRank() {{ return rank;return rank; }}}}

Page 20: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

20

程式追蹤程式追蹤 (6/6)(6/6)Card diCard diaamond_10 = new Card();mond_10 = new Card();didiaamond_10.SetSuit('d');mond_10.SetSuit('d');didiaamond_10.SetRank(10);mond_10.SetRank(10);char suit = dichar suit = diaamond_10.GetSuit();mond_10.GetSuit();int rank = diint rank = diaamond_10.GetRank();mond_10.GetRank();Console.WriteLine("{0}{1}", Console.WriteLine("{0}{1}", didiaamond_10.GetSuit(), mond_10.GetSuit(), didiaamond_10.GetRank());mond_10.GetRank());

Program.Main()

diamond_10

suit

rank

diamond_10

‘d’

10

suit ‘d’

rank 10<<temp0>>

<<temp1>>

‘d’

10

class Cardclass Card{{ . . .. . . public char GetSuit()public char GetSuit() {{ return suit;return suit; }} public int GetRank()public int GetRank() {{ return rank;return rank; }}}}

Page 21: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

21

屬性屬性 (Attribute, Property)(Attribute, Property) class Card{ private char suit; private int rank; public void SetSuit(char s) { suit = s; } public void SetRank(int r) { rank = r; } public char GetSuit() { return suit; } public int GetRank() { return rank; }}

class Card{ private char suit; private int rank; public char Suit { set { suit = value; } get { return suit; } } public int Rank { set { rank = value; } get { return rank; } }}

Page 22: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

使用屬性使用屬性

22

Card diamond_10 = new Card(); diamond_10.Suit='d'; diamond_10.Rank=10; char suit = diamond_10.Suit;int rank = diamond_10.Rank;Console.WriteLine("{0}{1}", diamond_10.Suit, diamond_10.Rank);

Card diamond_10 = new Card(); diamond_10.SetSuit('d');diamond_10.SetRank(10);char suit = diamond_10.GetSuit();int rank = diamond_10.GetRank();Console.WriteLine("{0}{1}", diamond_10.GetSuit(), diamond_10.GetRank());

Page 23: 1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation

練習練習• 使用屬性,修改並以偵錯器追蹤程式使用屬性,修改並以偵錯器追蹤程式CardDemoCardDemo

23