第二十二章 Cach 定義資料型別類

2021-10-24 00:18:32 字數 2732 閱讀 1843

定義資料型別類

在資料型別類中定義類方法

在資料型別類中定義例項方法

資料型別類的用途是用作物件類中的文字屬性的型別。資料型別類提供以下功能:

資料型別類在許多方面與其他類不同:

由於了解一些內部細節很有用,因此本節簡要討論資料型別類的工作方式。

如前所述,資料型別類的用途是用作屬性的型別,特別是在擴充套件核心物件類之一的類中。下面顯示了乙個具有三個特性的樣例物件類。每個屬性都使用乙個資料型別類作為其型別。

class datatypes.container extends %registeredobject

向類新增文字屬性並編譯該類時,caché會向該類新增屬性方法。作為參考,讓我們使用術語容器類來指代包含屬性的類。屬性方法控制容器類如何處理這些屬性的資料。

該系統的工作方式如下:

在這裡顯示的示例中,當我們編譯datatypes.container時,編譯器使用%string、%integer和%boolean資料型別類的方法生成器。這些方法生成器為每個屬性建立方法,並將這些方法新增到容器類。如上所述,這些方法稱為屬性方法。它們的名稱以它們所應用的屬性的名稱開頭。例如,對於p1屬性,編譯器生成諸如p1isvalid()、p1normalize()、p1logicaltodisplay()、p1todisplaytological()等方法。

請注意,屬性方法在類定義中不可見。

許多屬性方法將資料從一種格式轉換為另一種格式,例如,當以人們可讀的格式顯示資料或通過odbc訪問資料時。

格式為:

類引數在與資料型別類一起使用時具有特殊行為。對於資料型別類,類引數用於提供一種基於資料型別自定義任何屬性行為的方法。

例如,%integer資料型別類有乙個類引數maxval,它指定%integer型別的屬性的最大有效值。如果使用屬性numkids定義類,如下所示:

property numkids as %integer(maxval=10);
這指定numkids屬性的%integer類的maxval引數將設定為10。

在內部,這是這樣工作的:標準資料型別類的驗證方法都實現為方法生成器,並使用它們的各種類引數來控制這些驗證方法的生成。

在此示例中,此屬性定義為numkidsisvaliddt()方法生成內容,該方法測試numkidsisvaliddt()的值是否超過10。如果不使用類引數,建立此功能將需要定義integerlessthanten類。

若要定義資料型別類,請首先標識最接近你需要的現有資料型別類。建立此類的子類。在的子類中:

如果需要,還可以新增自己的類引數。

如果資料型別類不是基於現有的資料型別類,請確保將[classtype=datatype]新增到類定義中。如果類基於另乙個資料型別類,則不需要此宣告。

根據需要,應該在資料型別類中定義以下部分或全部類方法:

classmethod isvalid(%val) as %status
其中%val是要驗證的值。如果值無效,此方法應返回錯誤狀態,否則應返回$ok。

注意:caché中的標準做法是不呼叫空值的驗證邏輯。

classmethod normalize(%val) as type
翻譯:

其中%val是要驗證的值,type是合適的型別類。

classmethod displaytological(%val) as type
其中%val是要轉換的值,type是合適的型別類。

其他格式轉換方法具有相同的形式。

請注意,odbc值必須與資料型別類的 odbc type類關鍵字指定的odbc型別一致。

如果資料型別類包括displaylist和valuelist引數,則這些方法必須首先檢查是否存在這些類引數,幷包含處理這些列表的**。其他方法的邏輯與此類似。

在大多數情況下,這些方法中的許多都是方法生成器。

例如:

classmethod logicaltodate(%val as %mv.date) as %library.date [ codemode = expression, serveronly = 1 ]

注意:請注意,資料格式和轉換方法不能包含嵌入式sql。如果需要在此邏輯中呼叫嵌入式sql,則可以將嵌入式sql放在單獨的例程中,該方法可以呼叫此例程。

還可以向資料型別類新增例項方法,這些方法可以使用變數%val,該變數包含屬性的當前值。編譯器使用它們在使用資料型別類的任何類中生成關聯的屬性方法。

例如,考慮以下示例資料型別類:

class datatypes.mydate extends %date

}

假設我們有另乙個類,如下所示:

class datatypes.container extends %persistent

當我們編譯這些類時,caché會將例項方法dobtomydate()新增到容器類中。然後,當我們建立container類的例項時,我們可以呼叫此方法。例如:

samples>set instance=##class(datatypes.container).%new()

samples>set instance.dob=+$h

samples>write instance.dobtomydate()

30/10/2014

第二十二章 Teamware需求

teamware正如他的名字一樣,是乙個團隊使用的groupware。groupware的定義是 teamware的功能需求 公共功能 使用者管理 角色管理 客戶管理 crm 專案管理 安全 授權和認證 業務功能 公告欄 notice 位址本 address book todo列表 todo lis...

第二十二章 Cach 變數大全 X 變數

包含游標的當前水平位置。x x包含游標的當前水平位置。將字元寫入裝置時,cach 會更新 x以反映水平游標位置。輸出的每個可列印字元將x加1 回車符 as cii13 或換 頁符 asci i12 將 x加1。回車符 ascii 13 或換頁符 ascii 12 將 x加1。回車 符 a scii ...

第二十二章 橋接模式

很多情況下用繼承會帶來麻煩。比如,物件的繼承關係是在編譯時就定義好了的,所以無法在執行時改變從父類繼承的實現。子類的實現與它的父類有非常緊密的依賴關係,以至於父類實現中的任何變化必然會導致子類發生變化。當你需要復用子類時,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這...