<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    在delphi中如何動(dòng)態(tài)建立類的實(shí)例

    本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!


        在面向?qū)ο笳Z(yǔ)言中,用兩種方法建立類的實(shí)例:靜態(tài)建立和動(dòng)態(tài)建立。靜態(tài)建立就是在程序中顯式地建立類的實(shí)例,如c1 = TClass1.Create()。而動(dòng)態(tài)建立是在只知道類名的前題下建立類的實(shí)例。動(dòng)態(tài)建立在實(shí)現(xiàn)上要比靜態(tài)建立更靈活,因?yàn)閯?dòng)態(tài)建立無(wú)需引用被建立 類,并且更容易實(shí)現(xiàn)如多態(tài)等面向?qū)ο筇匦浴?br />
    一、    動(dòng)態(tài)建立類的實(shí)例
    在delphi中動(dòng)態(tài)建立類的實(shí)例可分為4步。
    1. 聲明一個(gè)從TPersistent繼承的類。因?yàn)樵谧?cè)類時(shí)要求必須從TPersistent繼承。
    2. 注冊(cè)類。可以使用RegisterClass等過(guò)程進(jìn)行注冊(cè)。
    3. 驗(yàn)證類是否被注冊(cè)(可選)。如果確定要建立的類已經(jīng)注冊(cè)了,可以省略此步。
    4. 得到并建立類。可使用FindClass(classname)得到要建立的類,然后使用Create方法建立類的實(shí)例。
    下面給出一個(gè)動(dòng)態(tài)建立類實(shí)例的簡(jiǎn)單實(shí)現(xiàn)。
    第一步的代碼
    TClass1 = class(TPersistent)
    public
      function GetValue(): String;
    end;

    function TClass1.GetValue(): string;
    begin
      result := 'hello world';
    end;
    第二步的代碼
    Initialization //可將這兩行放在end.的前面
      RegisterClass(TClass1);
    第三步和第四步的代碼
    procedure TForm1.Button1Click(Sender: TObject);
    var
      class1: TClass1;
    begin
      if GetClass('TClass1')<>nil then
      begin
        class1 := FindClass('TClass1').Create as TClass1;
        showmessage(class1.GetValue);
      end;
    end;

    在delphi 中不僅可以根據(jù)類名動(dòng)態(tài)建立類的實(shí)例,而且在注冊(cè)時(shí)可以給類起一個(gè)別名,在建立類的實(shí)例時(shí)即可以使用類名,也可以使用別名。如上述代碼中 RegisterClass(TClass1);可改為RegisterClassAlias(TClass1, ‘class1’);。而FindClass(‘TClass1’)也可改為FindClass(‘class1’)。另外,如果注冊(cè)的類比較多,也可使 用RegisterClasses一次注冊(cè)多個(gè)類。RegisterClasses的定義如下。
    procedure RegisterClasses(AClasses: array of TPersistentClass);
    首先聲明一個(gè)TpersistentClass類型的數(shù)組,然后將要注冊(cè)的類按順序賦到這個(gè)數(shù)組中,最后調(diào)用RegisterClasses即可。

    二、通過(guò)動(dòng)態(tài)建立實(shí)現(xiàn)多態(tài)
    多 態(tài)在程序設(shè)計(jì)中是非常重要的概念之一。它主要是通過(guò)繼承來(lái)實(shí)現(xiàn)的。簡(jiǎn)單地說(shuō),就是n個(gè)類從一個(gè)類繼承或?qū)崿F(xiàn)一個(gè)接口,這n個(gè)類繼承父類的所有 virtual方法或?qū)崿F(xiàn)父接口的所有方法,并做出不同的實(shí)現(xiàn)。這n個(gè)類的實(shí)現(xiàn)都不一樣,而它們的調(diào)用確是一樣的,即對(duì)于調(diào)用來(lái)說(shuō)是透明的。
    如果使用靜態(tài)建立類實(shí)例的方法實(shí)現(xiàn)多態(tài),當(dāng)類很多時(shí)需要進(jìn)行大量的判斷。而使用動(dòng)態(tài)建立類實(shí)例的方法只要將子類的類名或別名當(dāng)做參數(shù)傳入即可。下面舉一個(gè)例子如何在delphi中利用動(dòng)態(tài)建立類實(shí)例的方法實(shí)現(xiàn)多態(tài)。
      //定義父類
    TClassParent = class(TPersistent)
      public
    //這是一個(gè)抽象虛函數(shù),相當(dāng)于c++的純虛函數(shù)
    function Greet(name: string): string; virtual; abstract; 
    end;
    //定義兩個(gè)子類
      TEnglish = class(TClassParent)
        function Greet(name: string): string; override;
      end;
      TChinese = class(TClassParent)
        function Greet(name: string): string; override;
      end;

      //實(shí)現(xiàn)兩個(gè)子類的Greet函數(shù)
    { TClassEnglish }
    function TEnglish.Greet(name: string): string;
    begin
      result := 'hello ' + name;  //返回英文的問(wèn)候
    end;
    { TClassChinese }
    function TChinese.Greet(name: string): string;
    begin
      result := '您好 ' + name;  //返回中文的問(wèn)候
    end;

    //注冊(cè)兩個(gè)子類
    initialization
      RegisterClassAlias(TEnglish, 'eng');
      RegisterClassAlias(TChinese, 'chn');

    //根據(jù)用戶的選擇建立類的實(shí)例
    procedure TForm1.Button2Click(Sender: TObject);
    var
      parent: TClassParent;
    begin   
      if GetClass(combobox1.Items[combobox1.itemindex])<>nil then
      begin
    //此處FindClass的參數(shù)可以是類名,也可以是別名
    //本例中將類名放入了combobox中
        parent :=  FindClass(combobox1.Items[combobox1.itemindex]).Create as TClassParent;
        showmessage(parent.Greet('bill gates'));
      end;
    end;
     
    程序界面






    Android開(kāi)發(fā)完全講義(第2版)(本書(shū)版權(quán)已輸出到臺(tái)灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-05-10 19:10 銀河使者 閱讀(3189) 評(píng)論(0)  編輯  收藏 所屬分類: delphi 原創(chuàng)

    主站蜘蛛池模板: 亚洲精品视频免费| 黄网站色视频免费在线观看的a站最新| 亚洲最新中文字幕| 久久亚洲AV无码精品色午夜 | 免费大片av手机看片高清| 免费福利在线观看| 免费人妻无码不卡中文字幕18禁| 男女拍拍拍免费视频网站| av电影在线免费看| 精品国产免费人成网站| 9久热精品免费观看视频| 日韩电影免费在线观看网站 | 永久亚洲成a人片777777| 中文字幕亚洲综合久久菠萝蜜| 精品亚洲一区二区三区在线观看| 在线精品亚洲一区二区小说| 亚洲中文字幕不卡无码| 久久精品夜色国产亚洲av| 精品亚洲A∨无码一区二区三区| 亚洲美女色在线欧洲美女| 中文字幕无码精品亚洲资源网久久| 亚洲区日韩精品中文字幕| 国产精品久久久久久亚洲小说| 老司机午夜免费视频| 精品97国产免费人成视频| 久久青草91免费观看| 黄页网站免费在线观看| 最好免费观看韩国+日本 | 人妻无码一区二区三区免费 | 亚洲精品国产字幕久久不卡| 91手机看片国产永久免费| 久久夜色精品国产噜噜亚洲a| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品亚洲综合五月天| 亚洲Av无码国产一区二区| 一级特黄录像视频免费| 久久这里只精品99re免费| 久久精品免费一区二区喷潮| 免费大黄网站在线观看| 亚洲A∨无码一区二区三区| 亚洲H在线播放在线观看H|