1. 程式人生 > >Delphi根據字串例項化物件

Delphi根據字串例項化物件

我們可以通過ClassRegistry單元的TClassRegistry類很輕鬆的根據字串創建出物件。

下面是該類幾個主要函式的說明:

Delphi 根據字串建立物件 - mopishv0 - MopishCrajorV0
// 獲取TClassRegistry自身的單例引用
classfunction GetClassRegistry: TClassRegistry;
// 註冊需要動態建立的類
procedure RegisterClass(ClassName: UnicodeString; ObjectClass: TClass); overload;
// 判斷給定的類名是否註冊
function HasClass(ClassName: UnicodeString): Boolean;
// 根據類名建立物件例項
function CreateInstance(ClassName: UnicodeString): TObject;

當使用工廠模式或者抽象工廠模式建立產品的時候,如果我們要擴充套件新的具體產品,在建立方法中新增分支結構

需要改動原有的工廠類。如果能夠根據字串實現動態建立那麼只要新增新的具體產品單元就可以了。

以下是一個用delphi簡單實現的Demo:

UnitCar單元程式碼:

Delphi 根據字串建立物件 - mopishv0 - MopishCrajorV0
 1unit UnitCar;
 2
 3interface 4
 5type 6
 7  TCar =classabstract 8    function Run: string
virtualabstract;
 9  end;
10
11  TRedCar =class(TCar)
12    function Run: stringoverride;
13  end;
14
15  TBlueCar =class(TCar)
16    function Run: stringoverride;
17  end;
18
19  TBlackCar =class(TCar)
20    function Run: stringoverride;
21  end;
22
23implementation24
25uses26  ClassRegistry;
27
28{ TBlackCar 
}29
30function TBlackCar.Run: string;
31begin32  Result :='BlackCar Ready to run!'33end;
34
35{ TBlueCar }36
37function TBlueCar.Run: string;
38begin39  Result :='BlueCar Ready to run!'40end;
41
42{ TRedCar }43
44function TRedCar.Run: string;
45begin46  Result :='RedCar Ready to run!'47end;
48
49initialization50  TClassRegistry.GetClassRegistry.RegisterClass(TRedCar.ClassName, TRedCar);
51  TClassRegistry.GetClassRegistry.RegisterClass(TBlueCar.ClassName, TBlueCar);
52  TClassRegistry.GetClassRegistry.RegisterClass(TBlackCar.ClassName, TBlackCar);
53end.

在這裡我們聲明瞭一個抽象的基類TCar和繼承自TCar的三個具體的類。

在單元初始化處用RegisterClass方法註冊了這三個子類。

UnitMain呼叫處程式碼:

Delphi 根據字串建立物件 - mopishv0 - MopishCrajorV0
 1procedure TDemoForm.CreateClick(Sender: TObject);
 2var 3  ClassRegistry: TClassRegistry;
 4  Car: TCar;
 5begin 6  ClassRegistry := TClassRegistry.GetClassRegistry;
 7  if ClassRegistry.HasClass(Name.Text) then 8  begin 9    Car := ClassRegistry.CreateInstance(Name.Text) as TCar;
10    Memo.Lines.Add(Car.Run);
11    Car.Free;
12  endelse13    Memo.Lines.Add(Format('Class %s has not registerd!', [Name.Text]));
14end;

效果圖:

 

如果我們需要擴充套件個TYellowCar那麼我們只要添加個繼承自TCar的TYellowCar類並且註冊該類就可以了。

相關推薦

Delphi根據字串例項物件

我們可以通過ClassRegistry單元的TClassRegistry類很輕鬆的根據字串創建出物件。 下面是該類幾個主要函式的說明: Code// 獲取TClassRegistry自身的單例引用classfunction GetClassRegistry: TClassRe

Delphi 通過字串例項

D2007 通過字串建立窗體類物件 1、需要在程式初始化的時候將類註冊,註冊到物件 RegGroups:(TRegGroups)中,以便查詢。 註冊類使用的函式:RegisterClass ,窗體初始化操作放在initialization 中。 un

根據字串的形式,自動匯入模組並使用反射找到模組中的類,並例項物件,利用importlib和getattr實現的

例如: auth資料夾下一個SCRF.py檔案,裡面有一個Cors類 class CORS(object): def process_request(self): print('666') auth資料

python 根據類名例項物件

方法一: class obj(object):        pass   a = eval('obj()') 方法二: 如果是經常需要這樣可以 #將用來建立物件的字串預編譯成code物件. create_obj = compile('obj()',

java通過反射,只需要傳了類名和引數,就可以根據不同引數的構造方法例項物件

轉載自:http://www.jianshu.com/p/69ca44916ebf 程式碼塊 @requires_authorization private Object reflateInstance(String className, Object[] args)th

python中如何統計一個類的例項物件

類中的靜態變數 需要通過類名.靜態變數名 來修改 ;通過物件不能修改 python中如何統計一個類的例項化物件?? 1 class Person: 2 #靜態變數count,用於記錄類被例項化的次數 3 count = 0 4 5

2018-10-15 例項物件 Instantiate與銷燬遊戲物件GameObject.Destroy

  GameObject.Instantiate(Object, Vector3, Quaternion, transform.parent); Quaternion[四元數]:例項化後物件的旋轉情況 Quaternion.identity:無旋轉   &nb

collection.namedtuple例項物件

from collection import namedtuple # human = namedtuple('human', ['name', 'height', 'age', 'sex']) h = human('James', 180, 32, 0) # then you can use h.na

java反射例項物件

-Class類Java中手動建立的每一個類,在編譯後JVM都會為其建立一個Class類物件,在這個Class類物件中儲存了所建類的資訊。可通過Class類提供的方法為一個類例項化物件,區別與new關鍵字建立物件,前者是在類已經編譯好的情況下,通過指定類名來建立例項化物件,後者

jsp呼叫javaBean方式一(new例項物件)

   1:javabean package cn.mldn.lxh.demo; /**  * javaBean 留給JSP呼叫  *   * @author Administrator  *   */ public class SimpleBean {private Str

java內部類例項物件

package com.lzcc.oop.testpolymorphism; /** * 多型測試 * * @author 包子 * */ public class Person {

c#中用反射的方式例項物件

定義一個類: namespace Example { public class ExampleClass {  public int iID = 0;  public string strName = "";  public ExampleClass()  {   iID

反射機制--獲取例項物件

在上一節中(點選開啟連結),獲取到了位元組碼檔案物件,那麼如何獲取該位元組碼檔案對應的Person物件呢?(仍然使用在text包下定義的Person類。) 執行早期的方法: package text; public class ReflectDemo2 { publ

js中 建構函式,原型,和例項物件

1,建構函式建立物件造成的記憶體浪費,和原型的引入 function Person(name,age){ this.name = name; this.age = age; this.introduce = function

介面和抽象類不能例項物件

ArrayList points = new ArrayList(); Iterator i = points.iterator(); points是ArrayList的物件,用points.iterator轉換成迭代器的形式也就是i物件; i是Iterator的引用

MINE筆記-面向物件程式設計,原型鏈的理解,建構函式,原型物件例項物件,prototype 運用

// to do list 建立建構函式,例項化物件,來做面向物件程式設計 // 建立建構函式--原型函式(原型物件) function person(name,age,id){ this.name = name; this.age = age; this.id =id // c

建構函式是什麼,有什麼作用,例項物件,面向物件分析

js裡的面向物件分析-(建立例項化物件) ECMAScript 有兩種開發模式:1.函式式(過程化),2.面向物件(OOP)。面向物件的語言有一個標誌,那就是類的概念,而通過類可以建立任意多個具有相同屬性和方法的物件。但是,ECMAScript 沒有類的概念,因此它的物件也與基於類的語言中的物件

3. 延遲例項物件

在預設情況下,程式一開始就會把配置檔案中的所有物件都進行例項化。 為了驗證這一點,我們可以只在Main方法裡只寫獲取上下文,不寫GetObject。 static void Main(string[] args) {

C++只在棧或堆上例項物件

C++如何讓類物件只能在堆(棧)上分配空間 一般情況下寫一個類都是可以採用new在堆上分配空間,或直接採用 類名+物件名 的方式在棧上分配空間。但有時候,如果想讓一個類只能在棧上或者堆上分配空間,又該怎麼實現呢? 下面分別來介紹如何定義只能在棧上或堆上例項化

java 類的建立,如何通過類例項物件

一、 1.建立的類名要大寫。例如Person類,P要大寫。 2.編寫類的屬性,即成員變數。注意屬性對應的資料型別,一般類似身份證號的資料型別都用String。 2.構造方法。當你不寫構造方法時,系