第二章 定義類的層次結構

2021-05-23 08:35:01 字數 2438 閱讀 6526

定義類的層次結構

複雜型別一般在**中以類的形式實現。複雜類更進一步通過增加特殊結構的繼承關係來定義。這種方式,乙個通用型別比如」price」 可以派生出為乙個更加特殊的型別如」stock price」 或者

「house price」.wcf支援通過在wsdl中合適的表示的類的繼承關係,在類結構和xml之間序列化和反序列化它們同時從每個類中取出屬性並加入到乙個集合中。

在列表2.17中,類price由三個元素和乙個子類組成。stockprice,繼承自price.命名空間應用到兩個類上所以它們在xml中由完全合法的名字。每個元素保留自己的命名空間。

列表2.17 使用資料契約定義類的層次結構

生成這兩段xml元資料是用來支援列表2.18中顯示的基礎關係。首先顯示price xml元資料,其次顯示stockprice xml元資料。注意stockprice匯入price元資料。注意在xsd中,所有的元素都是用minoccurs=0來定義,因為在**中它們都沒有使用[isrequired=true]來定義屬性。

列表2.18 xml元資料中定義的類的層次結構

乙個序列化的stockprice型別的soap訊息體在列表2.19中顯示。注意price和stockprice的命名空間完全通過soap訊息體被從列表2.17的**搬到列表2.18中的xml元資料中。

列表2.19 soap訊息體中序列化的類層次結構

在wsdl中使用knowntypes暴露額外型別

如果資料型別滿足任何先前描述的條件,那麼它們會在wsdl中暴露出來。有一些額外的可能,當然,你也可能想強制乙個型別包含在wsdl契約中

舉乙個類繼承的例子。如果乙個序列化的派生類到達乙個期待得到乙個序列化的基類的終結點時,wcf不會知道如何反序列化這個派生類因為它不是契約的一部分。另外乙個例子是乙個hashtable 類,儲存了其他的類作為自己的元素。wsdl將會定義hashtable類,但是不是那麼儲存在hashtable內部的類。

在這些情況下,你必須告訴wcf這些應該顯示包含在wsdl契約中的類。這是使用knowntypes完成的。它可以在四種方式下完成:通過新增乙個knowntype屬性到[datacontract],通過在[servicecontract]或者[operationcontract]的屬性,通過在配置檔案中新增乙個引用給它以及它的程式集,或者通過在生成wsdl時定義它。

列表2.20顯示了定義基類的資料契約,price,有兩個類派生自基類,stockprice和metalprice.注意在資料契約上的[knowntype]屬性。這告訴wcf當暴露契約時要包含stockprice和metalprice的xsd表示。這個列表也包含了服務實現。getprice操作是多型的,它的返回值型別可以是stockprice或者metalprice,取決於哪乙個操作被請求。通過**呼叫getprice的客戶端**必須把結構強制轉換成需要的型別來訪問返回值類。

列表2.20 資料契約中定義的knowntype

相應的,你可以使用[serviceknowntype]屬性在operationcontract層次定義knowntype.當knowntypes被定義在操作層時,派生類只可以在定義了已知型別的操作中使用。換句話說,並不是乙個服務中的所有操作都可以使用派生類。列表2.21顯示了使用[serviceknowntype]的**片段。在這個例子中,當訊息從服務端返回時乙個客戶端可以呼叫getprice方法,反序列化器將建立乙個stockprice或者metalprice物件。但是當客戶端呼叫setprice時只可以傳遞乙個price物件,而不是乙個stockprice或者metalprice物件,因為序列化器不知道在xml中如何表達這些派生型別。

列表2.21 操作契約中定義的knowntype

無論是在資料契約層還是服務契約層,在**中定義已知型別的劣勢在於你需要在編譯時就知道轉化的派生類。如果乙個新型別被新增,你需要重新編譯**。這可以使用兩種方法來解決。

首先,你可以把已經型別引用從**中挪到配置檔案中去,在服務配置檔案中的system.runtime.serialization部分加入已經型別資訊。考慮到類繼承關係,你需要新增引用到基類並新增knowntype引用到派生類。這在列表2.22中顯示,當essentialwcf.price是基類而且essentialwcf.stockprice和essentialwcf.metalprice是派生類時,stockservice是寄宿這些型別的dll.

列表2.23 配置檔案中定義的knowntype

在契約中確定派生類性的最普通方法就是在執行時生成它。這可以通過wcf暴露的鉤子來完成。[knowntype]和[serviceknowntype]的兩個建構函式都接受字串引數。這個字串是在序列化或者反序列化時返回一系列已知型別的方法名。如果你使用乙個原資料容器,你可以在容器或者資料庫中尋找型別資訊並在執行時暴露它們。列表2.23顯示了乙個簡單的實現,顯示了型別名被硬編碼到getknowntypes方法中而不是從外部容器被拖入。

列表2.23 執行時**中定義的knowntype

第二章 順序結構

c語言沒有輸入輸出語句,通過函式庫完成,只需要用工具取出來。輸入輸出函式庫名稱為stdio。如何取出函式?1.明確函式在什麼庫中,如輸入輸出函式存在於stdio.h函式庫中。2.使用預編譯指令調入函式庫 include 如果是自定義的標頭檔案作為函式庫,採用雙引號包含庫名。輸出函式 printf 字...

第二章 HTML結構

dtd document type definition 規定了標記語言的規則,使得瀏覽器可以正確的呈現內容。html結構是一種巢狀結構,如同洋蔥,從外到裡。web頁面結構,即dom document object model 樹結構。現在主流的編輯器 ide 都會帶有 提示功能,如webstorm...

第二章 類和物件

1.類和物件 類 student 物件 s1,s2 類的一般形式 class student 成員函式的實現 2.成員的訪問許可權 公有,私有,保護 未宣告哪一類,預設許可權為private 3.訪問物件 s1 s2 或 p 的成員 物件名.函式名 s1.disp 指標變數 函式名 p disp i...