1 / / / /. 2 (object) (object) –, 10 (class) (class) –, –, – (variables) [ data member field...
TRANSCRIPT
1
物件與類別補充說明物件與類別補充說明
鄭士康鄭士康國立台灣大學國立台灣大學
電機工程學系電機工程學系 //電信工程研究所電信工程研究所 //資訊網路與多媒體研究所資訊網路與多媒體研究所
2
物件與類別物件與類別• 物件物件 (Object)(Object)
– 狀態與功能:例如狀態與功能:例如 , , 撲克牌撲克牌♦♦ 10 10
• 類別類別 (Class)(Class)– 藍圖:例如藍圖:例如 , , 泛稱撲克牌泛稱撲克牌– 狀態:變數狀態:變數 (Variables) [(Variables) [ 資料成員,資料成員, Data Data
membermember ,, FieldField ,, Attribute](Attribute]( 花色花色 , , 點數點數 ))– 功能:函式功能:函式 (Function) [(Function) [ 方法成員,方法成員, Member Member
functionfunction ,, MethodMethod ,, OperationOperation ,, ResponsibiResponsibilities]lities]
(( 設定或告知花色與點數設定或告知花色與點數 ))
3
封裝封裝 (Encapsulation)(Encapsulation)
• 類別將狀態變數與功能函式封裝起來類別將狀態變數與功能函式封裝起來• 通常狀態變數為私有通常狀態變數為私有 (private) (private) ,只供同類,只供同類
別之功能函式取用,不可以由類別外直接取用別之功能函式取用,不可以由類別外直接取用– 避開同名變數問題避開同名變數問題– 避免被不慎改動,破壞狀態的正確一致性避免被不慎改動,破壞狀態的正確一致性– 容易維護,不影響外界程式容易維護,不影響外界程式
• 功能函式可能公用功能函式可能公用 (public) (public) ,也可能私有,也可能私有• 一類別至少有一公用函式,以便應用一類別至少有一公用函式,以便應用
4
類別 類別 CardCard
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) {{
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());
}} }}}}
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;
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; }}
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; }} }}}}
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; . . .. . .}}
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; }} . . .. . .}}
12
函式參數函式參數• 參數參數 (Parameters, (Parameters, 或稱引數 或稱引數
Arguments)Arguments)– 形式參數形式參數 (Formal Parameters)(Formal Parameters)– 真實參數真實參數 (Actual Parameters)(Actual Parameters)
13
記憶配置記憶配置
真實參數’ d’
形式參數 s
Main
SetSuit
diamond_10suit
rank
Program
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; } . . .}
}
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; }} . . .. . .}}
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; }} . . .. . .}}
17
函式傳回值函式傳回值
Main
suit
GetSuit
傳回值
suit
rank
diamond_10
Program
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; } . . .}
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; }}}}
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; }}}}
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; } }}
使用屬性使用屬性
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());
練習練習• 使用屬性,修改並以偵錯器追蹤程式使用屬性,修改並以偵錯器追蹤程式CardDemoCardDemo
23