![](/img/trans.png)
[英]I can't make select populate component with new child components and retain its value
[英]Visual inheritance of DB components or New component?
我有3個不同的DataModules:ADOModule,SDACModule,AstaModule。 除了它們使用的DB組件外,其他所有組件都是相同的:ADO,SDAC,Asta。
所有這些DataModule都通過不同的組件完成相同的工作。 我的意思是-所有內部選擇和執行者都是相同的。
我要搜索的是一種將所有這些DataModule組合為一個BaseDataModule的方法,並強制ADOModule,SDACModule和AstaModule各自繼承自BaseDataModule。
好吧,我發現繼承方法和屬性很容易,但是我從未使用過從組件繼承。 有什么好辦法嗎? 項目目標:減少編碼和復制粘貼。
請允許我提出一條不同的道路。 我建議您全部基於TClientDataset
而不是任何其他特定的數據集編寫DataModules。 添加所需的所有屬性和方法,始終與TClientDataset
實例一起使用。
然后創建一個數據訪問服務接口,例如IDataProvider
,該接口提供選擇數據和執行SQL語句的方法。 select方法將接收查詢文本,並返回一個OleVariant
,它將保存找到的所有記錄(內部TClientDataset
的Data
屬性)。 當將此OleVariant
分配給DataModule上的TClientDataset
實例的Data
屬性時,將對其進行填充。
最后,將實現類寫入IDataProvider
。 這些類將取決於您需要支持的特定數據訪問技術。
這種體系結構將使您的應用程序完全獨立於數據訪問方法。 將來,如果您需要第四種方式來獲取數據,則只需添加IDataProvider
的新實現,其余所有將繼續工作。
如果將這些實現類放在單獨的程序包中,則可以通過動態加載這些程序包來動態設置應用程序以使用不同的數據訪問方法,而不必重新編譯應用程序。 考慮一下這有多好!
您可以使用幾種選擇,但我采用的方法如下:
為您的數據庫和查詢組件創建一個抽象基類。 基類應該定義您將需要的所有方法和屬性。
為每個數據訪問層創建具體的子孫,這些子孫實際上是基礎數據訪問層的包裝。
將當前數據模塊代碼移到引用抽象組件類型而不是訪問層的任何特定類型的非可視單元中。
您現在可以輕松地在訪問層之間切換,甚至將來可以添加新的訪問層。
這是適配器(或包裝器)模式的經典示例。
如果您不想重新發明輪子,則可能需要考慮研究諸如tiOPF,InstantObjects或TMS Aurelius之類的OPF / ORM解決方案,這些解決方案將為您提供相同的功能以及更多其他功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.