<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)

    主站蜘蛛池模板: 91精品国产免费| 黄页免费视频播放在线播放| 国产在线精品免费aaa片| 免费成人午夜视频| 美女尿口扒开图片免费| 免费看无码自慰一区二区| 亚洲欧洲无卡二区视頻| 亚洲国产精品久久丫| 免费看又黄又无码的网站| 亚洲国产一区在线| 99久热只有精品视频免费看| 亚洲精品无码久久久久久久 | 亚洲va无码va在线va天堂| a高清免费毛片久久| 中文字幕精品亚洲无线码二区| 中文字幕免费观看全部电影| 亚洲日韩精品一区二区三区无码| 精品无码一级毛片免费视频观看| 亚洲精品无码久久千人斩| 久久免费线看线看| 亚洲人成高清在线播放| a级毛片无码免费真人| 亚洲av无码一区二区三区四区| 午夜亚洲国产成人不卡在线| 一区二区三区免费在线观看| 久久精品国产亚洲沈樵| 51在线视频免费观看视频| 亚洲娇小性xxxx| 97在线免费视频| 久久av无码专区亚洲av桃花岛| 在线观看特色大片免费视频 | 国产特黄特色的大片观看免费视频 | MM1313亚洲国产精品| 久久不见久久见免费影院| 国产成人人综合亚洲欧美丁香花 | 国产jizzjizz免费视频| 亚洲三级在线观看| 免费在线观看黄网| 免费人妻无码不卡中文字幕系| 亚洲熟女综合一区二区三区 | 亚洲影院在线观看|