程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi_09_Delphi_Object_Pascal_面向對象編程,delphiobjectpascal

Delphi_09_Delphi_Object_Pascal_面向對象編程,delphiobjectpascal

編輯:Delphi

Delphi_09_Delphi_Object_Pascal_面向對象編程,delphiobjectpascal


  今天這裡討論一下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.

 

       歡迎轉載本系列文章,轉載請注明來源。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved