4.5數(shù)據(jù)的隱藏和友好訪問_第1頁
4.5數(shù)據(jù)的隱藏和友好訪問_第2頁
4.5數(shù)據(jù)的隱藏和友好訪問_第3頁
4.5數(shù)據(jù)的隱藏和友好訪問_第4頁
4.5數(shù)據(jù)的隱藏和友好訪問_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、使用屬性和索引平衡數(shù)據(jù)隱藏和訪問1LibM的改進版本封裝的第二階段:數(shù)據(jù)隱藏應(yīng)用以下技術(shù):恰當(dāng)?shù)脑L問限定符成員常量和成員初始化構(gòu)造函數(shù)、析構(gòu)函數(shù)靜態(tài)成員,靜態(tài)類2使用getter/Setter函數(shù)對對類內(nèi)部的私有數(shù)據(jù)進行操作優(yōu)點:實現(xiàn)了數(shù)據(jù)隱藏和安全訪問對讀/寫可進行靈活的控制缺點:代碼比較繁瑣可讀性較差,影響到可編程性有沒有兩全其美的方法呢?屬性3類的屬性成員用來描述、表達對象的一些特征屬性,是對變量成員的一種擴展C#中,屬性使用專門的訪問函數(shù)對屬性值進行讀寫操作,提供了比變量成員更為靈活的應(yīng)用機制使用時形式上像數(shù)據(jù)成員(虛字段),本質(zhì)上是方法格式 修飾符 數(shù)據(jù)類型 屬性名訪問函數(shù)體4類的另

2、一種成員“屬性”屬性字段+get/set方法 private int_age = 0;public int Age get return _age; set if (value 0)_age = 0;else_age = value; 讀存取器getter寫存取器setter5訪問函數(shù) get/setget用于向外部返回屬性成員的值,不帶參數(shù) 修飾符 get語句或語句塊Set用于處理類外部的寫入值,是一個帶有簡單值類型參數(shù)的方法 修飾符 set語句或語句塊特殊關(guān)鍵字value-set函數(shù)的隱式參數(shù)示例代碼:用屬性改寫B(tài)ox6定義一個“屬性”的步驟定義一個私有字段用于存儲屬性數(shù)據(jù)。設(shè)計一個get

3、方法,當(dāng)讀取屬性值時,向外界返回私有字段的當(dāng)前值。設(shè)計一個set方法,當(dāng)向?qū)傩再x值時,其自動隱含的value參數(shù)保存外界傳入的值,應(yīng)將此值傳給前面定義的私有字段。 7public class Employee private string firstName,lastName; private long idcard; private double salary; private double increase; public void PrintInfo() Console.WriteLine(姓名:0,name); Console.WriteLine(身份證號:0,idcard); Con

4、sole.WriteLine(基本工資:0,C,salary); Console.WriteLine(增加工資:0:C,increase); public void Raise(double percent) increase=percent*salary; public double Salary get return salary; set if (value=0 ) Console.Write(Its not a valid salary!); else salary=value; public string Name getreturn firstName+LastName; publ

5、ic long ID get return idcard;/為保證唯一,一般不修改 public double Increase getreturn increase; 員工的工資必須為非負數(shù)對一般用戶而言,工資的增長率應(yīng)該是只讀的只讀虛擬字段8 使用屬性如果只提供 get訪問器, 那么這個屬性是只讀的。如果只提供 set訪問器,那么這個屬性是只寫的。建議:將所有字段都定義為private。如果字段需要公開,請使用屬性將其公開9屬性解密10屬性vs 字段問答(1)問:屬性與字段在用法上很相似,那么,何時用字段,何時用屬性?答:如果需要完成以下任務(wù),則使用屬性較合適:(1)信息需要滿足特定的條件

6、或規(guī)則表達年齡的信息不允許出現(xiàn)負數(shù),這時,僅使用簡單的字段無法滿足要求。讀取某字段時判斷有沒有權(quán)限設(shè)置某字段時判斷新值是否合法(2)需要在賦值或讀取數(shù)據(jù)時完成特定的工作,比如給字段賦值時也希望在窗體上同步顯示其值。 (3) 為了更好地封裝數(shù)據(jù),僅在需要時公開11屬性vs 字段問答(2)問:屬性相對于字段有沒有別的好處?答:根據(jù)系統(tǒng)的需求,屬性可以只提供get/set訪問器,即只讀/只寫屬性,而字段要么不可讀寫,要么完全放開,故屬性具有更好的靈活性??偠灾?,屬性兼具字段和方法的特點,是推薦的實現(xiàn)。12屬性使用的另一例子13示例MyTime定義類對象的狀態(tài)對象的行為字段屬性方法1415C#支持的

7、第三種注釋方式,提供標準的方式對函數(shù)的功能、參數(shù)、返回值進行說明161718類成員的訪問屬性上述MyTime類中,所有成員的訪問屬性都是public.這樣,我們想獲得 小時數(shù)、分鐘數(shù)、秒數(shù) 比較方便19類成員的訪問屬性但也帶來了不安全的因素,因為public屬性既可以讓任何人來讀,也可以讓任何人來改寫。20類成員的訪問屬性那么,我們將類的字段的訪問屬性定義為private.這樣,在類的外部(類的使用者)就無法修改這個字段的值,因為根本看不到。當(dāng)然,也沒有辦法取它的值了。21有沒有一種途徑,它可以讓使用者像使用公共的字段一樣方便,又能讓設(shè)計者能夠進行安全地檢查?22使用屬性我們可以使用屬性來解決

8、這個問題。屬性,從外部(類的使用者)來看,類似于類的字段。從內(nèi)部(類的作者)來看,類似于類的方法。get訪問器set訪問器23MyTime preTime = new MyTime(19, 34, 56);MyTime nowTime = new MyTime(21, 45, 26);/這句錯誤,因為hour為私有域,不能在MyTime類外被訪問 int elapsedHour = nowTime.hour - preTime.hour;/error!int elapsedHour = nowTime.Hour - preTime.Hour;/Correct!nowTime.Minute =

9、106;nowTime.Second += 20;先調(diào)用Second屬性的一次Get操作,再調(diào)用一次Set操作調(diào)用set操作,但由于if條件不滿足,minute不變24屬性成員vs.變量成員變量成員本質(zhì)上就是變量,而屬性成員更大程度上是函數(shù)成員的一種,只是操作時形式比較類似變量訪問屬性成員在訪問修飾符的基礎(chǔ)上通過get/set函數(shù)提供對屬性的更為靈活、安全的訪問控制,可為(私有)的變量成員多一層邏輯保護,而變量成員只能通過訪問修飾符提供基本的數(shù)據(jù)隱藏功能屬性成員可通過只公開get/set,實現(xiàn)成員的只讀/只寫,而變量要么全部可見要么全不可見25自動屬性 class A int length;

10、public int Length get return length; set length = value; class A public int Length get; set; 等價1.自動屬性不需要創(chuàng)建私有成員2.如果除了簡單得讀取和賦值還要做起他的操作,必須單獨創(chuàng)建訪問器26索引器索引器是 C# 的簡單組件,索引器是一種特殊的類成員,它能夠讓對象以類似數(shù)組的方式來存取,使程序看起來更為直觀,更容易編寫索引器通常在包含元素集合的類中定義為類創(chuàng)建索引器后,可以通過從類對象指定索引來直接訪問對象內(nèi)部元素可以像訪問數(shù)組一樣訪問類的成員,而不用將內(nèi)部的細節(jié)暴露給用戶27class Index

11、erExample public string stringList=new string10; public string thisint index get return stringListindex; set stringListindex = value.ToString(); class Test static void Main() IndexerExample indexTest = new IndexerExample(); indexTest.stringList1=“Sam”; /不使用索引,必須開放內(nèi)部數(shù)據(jù)結(jié)構(gòu) indexTest2=Tom; System.Consol

12、e.WriteLine(“indexTest1是0nindexTest2是1, indexTest1, indexTest2); 28定義索引器的規(guī)則必須指定至少一個索引器參數(shù)應(yīng)當(dāng)為索引器參數(shù)賦值示例:使用索引給學(xué)生打分 29索引器與數(shù)組的比較4-1索引器不指向內(nèi)存位置索引器可以有非整數(shù)的下標(索引)可以重載索引器30索引器與數(shù)組的比較4-231索引器與數(shù)組的比較4-3using System.Collections;class StrIndex Hashtable studentList = new Hashtable(); public int thisstring name get re

13、turn (int) studentListname; set studentListname = value; class Test static void Main() StrIndex objIndex = new StrIndex(); objIndexSam = 232676; objIndexTom = 455464; System.Console.WriteLine(Sam 的電話號碼是 0,Tom 的電話號碼是 1, objIndexSam,objIndexTom); 索引器可以有非整數(shù)下標而數(shù)組不能有 學(xué)生通訊錄示例32索引器與數(shù)組的比較4-4using System.Col

14、lections;class IndexerExample public string stringList=new string10; public string thisint index get return stringListindex; set stringListindex = value.ToString(); public Hashtable studentList=new Hashtable(); public int thisstring number getreturn (int)studentListnumber; set studentListnumber = va

15、lue; 一個類可以有多個索引器但必須通過指定不同的索引類型重載索引器 33class Test static void Main() IndexerExample indexTest = new IndexerExample(); indexTest.stringList1=Sam; indexTest2=Tom; indexTestSam = 232; indexTestTom = 455; 訪問stringList 訪問studentList 34在索引器中使用多個參數(shù)可以指定多個索引器參數(shù)35索引器與屬性的比較屬 性 索 引 器允許調(diào)用方法,如同公共數(shù)據(jù)成員允許調(diào)用對象上的方法,如同對象是一個數(shù)組可通過簡單的名稱進行訪問可通過索引器進行訪問可以為靜態(tài)成員或?qū)嵗蓡T必須為實例成員其get訪問器沒有參數(shù)其get訪問器具有與索引器相同的形參表其set訪問器包含隱式value參數(shù)除了value參數(shù)外,其set訪問器還具有與索引器相同的形參表36編碼風(fēng)格方法應(yīng)簡短,開始給出注釋,說明輸入、輸出參數(shù)及其完成的主要功能最好含有return語

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論