今天這裡討論一下Delphi中的面向對象編程,這裡不做過多過細的討論,主要做提綱挈領的描述,幫助自己抓做重點。
本隨筆分為兩部分:
一、面向對象編程
二、面向對象編程詳細描述
------------------------------------------
一、面向對象編程
下面是工程文件的:
{ 面向對象編程基礎 1、class的定義/類的定義 2、構造函數 3、析構函數 4、封裝 5、繼承 } program oop; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var //定義一個類實例,或者說定義一個類對象 admin:TPersonMan; begin { 對象的使用 1、 使用對象之前必須用構造函數創建對象 2、 對象的構造函數是為Create方法 3、 對象構造的時候,必須用類型名,因為這個時候對象還沒有,所以不能 用對象實例的名字 4、 對象的析構,必須用 對象的實例名稱 } //實例化對象,訪問對象前必須實例化對象 admin := TPersonMan.Create(); //訪問對象的域 admin.id := 512109051; admin.strName := 'volcanol'; //訪問對象的方法,可以省略(), 最好不要省略,因為不省略的話可以明確的表示 //訪問的是對象的方法 admin.playFootball(); //Delphi的Object Pascal和 Java 、C#這樣具有自動垃圾回收機制的語言不一樣 //Object Pascal需要自己回收垃圾, 即在對象不再需要使用的時候,需要將對象 //的空間進行回收, 通過 Free() 方法和 Destroy() 方法實現,通常Free()方法 //更加的安全。 admin.Free(); //admin.FreeInstance(); ReadLn; end.
下面是單元文件unit1:
{ class類的定義 1、class關鍵字 2、封裝 3、繼承 4、構造函數 5、析構函數 } unit Unit1; interface uses SysUtils; type { 定義一個類 1、下面三種方式一樣 // 1、方式1 TPerson=class(TObject) end; //方式2: TPerson=class end; //方式3 TPerson=class; 方式1、 明確的類的父類, 通過在關鍵字class後面利用 (父類名稱)來完成 方式2、 在Delphi的Object Pascal中所有的類都一個共同的祖先類 TObject, 這個 TObject 類,相當於盤古或者女蝸一樣。 方式3、 方式3和方式2一樣,只是省略了關鍵字 end,注意只有在定義的類型 的時候 end 關鍵字可以省略,其他的時候不能省略。 要點: 1、如果用方式2定義則必須定義至少一個域,否則編譯報錯, 報錯類容為: TPerson 未完全定義。 2、如果用方式3定義,則必須顯式的指出類的父類型 Type TxxxObject=class(TObject); //正確的定義方法 } { Type TxxxObject=class; //編譯報錯,類型沒有定義完全。 } TPerson=class //類的域定義, 注意Delphi中Object Pascal的域 id:integer; //對象的封裝,但是這裡沒有完全體現封裝的真正“意義”。 end; TPersonMan=class(TPerson) //演示繼承類的定義方法 strName:shortString; //下面的兩種聲明方法的方式需要注意都可以,一般推薦使用第一種方式 //因為這樣更能表示這是一個方法。 procedure playFootball(); //procedure playFootBall; end; implementation { 類方法的實現 1、 和普通的方法一樣,類的方法也需要在實現中進行定義,否則將不能調用 2、 注意定義類的方法的時候,需要指定方法屬於哪一個類," . " 域操作符 來實現。 類名.方法名 } procedure TPersonMan.playFootball; begin WriteLn('I can play football :) !!!'); end; end.
二 面向對象編程
下面的工程對面向對象編程進行了更多的描述。
下面是工程文件:
{ 面向對象詳細 1、方法特性 static、virtual、dynamic、message 2、訪問特性控制: private、public、 3、域的 "屬性" 特性 } program OopDetail; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var //定義兩個對象 person:TPerson; teachar1:TTeachar; begin //實例化變量 person :=TPerson.Create(); //初始化域 person.gender := Male; person.name := 'volcanol'; person.height := 1.75; person.weight := 68; person.nationality := China; person.education := Primary; person.profession := Unemployment; //方法 person.eat(); person.language(); person.playBall(); WriteLn(''); //實例化對象 teachar1 := TTeachar.Create(); //初始化域 teachar1.gender := Female; teachar1.name := 'Lily'; teachar1.height := 1.65; teachar1.weight := 50; teachar1.nationality := England; teachar1.education := University; teachar1.profession :=Teachar; { 方法 1、注意調用 override 的方法的輸出 } teachar1.language(); teachar1.playBall(); teachar1.teaching(); teachar1.prepareLesson(); teachar1.testLesson(); ReadLn; end.
下面是單元文件:
{ class man 的定義 1、定義一個人的基類 2、基類的方法具有static、virtual、dynamic、message } unit Unit1; interface uses SysUtils; type //定義一個表示性別的枚舉類型 TGender=(Male,Female); //定義一個表示國籍的枚舉類型 TNation=(China,England,American); //定義一個表示學歷的枚舉類型 TEducation=(Primary,Junior,Senior,University); //定義一個職業的枚舉類型 TProfession=(Unemployment,Teachar,Docotor,Lawyer,Firefight); //**************************************************** // 定義一個人的類 // 1、人的屬性 --- 域 // 性別、姓名、身高、體重、國籍、學歷等 // 2、人的能力 --- 方法 // 外語、吃飯、打球等 //***************************************************** TPerson=class // 域 gender : TGender; name : shortstring; height : single; weight : single; nationality : TNation; education : TEducation; profession: TProfession; // 方法 //靜態方法 靜態方法不能被覆蓋 procedure eat(); //虛方法 父類的虛方法可以在子類中被覆蓋 procedure language(); virtual; procedure playBall(); virtual; end; TTeachar=class(TPerson) //域 // 方法 { 方法的覆蓋: 1、 通過 override 關鍵字表示 2、方法的覆蓋就是屏蔽父類的同名方法,注意與方法的重載 overload 的 區別 3、 } procedure language(); override; procedure playBall(); override; procedure teaching(); procedure prepareLesson(); procedure testLesson(); end; implementation //*********************************************************** // 實現 TPerson類的方法 procedure TPerson.eat(); begin WriteLn('I can eating.'); end; procedure TPerson.playBall(); begin WriteLn('I can play ball.'); end; procedure TPerson.language(); begin WriteLn('I can only speak one languave.'); end; //*********************************************************** // 實現 TTeacher 類的方法 procedure TTeachar.language(); begin WriteLn('I can speak lot of languave.'); end; procedure TTeachar.playBall(); begin WriteLn('I can not play ball.'); end; procedure TTeachar.teaching(); begin WriteLn('I am a Chinese teachar.'); end; procedure TTeachar.prepareLesson(); begin WriteLn('I am prepare math lesson.'); end; procedure TTeachar.testLesson(); begin WriteLn('I am testing English.'); end; end.
歡迎轉載本系列文章,轉載請注明來源。