一提到介面的用處相信很多人都說用來實現多繼承
,但為什麼需要多繼承
?有一點可以肯定的是多繼承用於實現物件更多的行為特性
,從而更靈活地和其他物件進行溝通完成相關的功能
.但在單繼承的語言中缺少了這樣重要的特性
,從而引伸出介面來擔負這個重任
.但在很多描述介面的文章中確很少提到介面在功能組合起到的重要作用
.在這裡向大家分享乙個在實際應用中通過介面作為功能組合的橋接例子
,從而使不同模組之間的偶合度更低組合更靈活.
在使用nclay
編寫應用案例時碰到乙個需求
,這個需求相信很多朋友在實際開發中都要面對
,那就是資料分頁
;資料分頁貫穿系統的所有邏輯層包括
view,bll
和dal,
如何實現資料分頁的邏輯描述資訊在這三個層之間傳遞的同時保證模組的偶合度成了關鍵
.在這裡通過**來詳細講述這個設計過程
,通過這個過程相信大家能夠體會介面在功能組合擔當著非常重要的角色.
制定分頁描述介面
public
inte***ce
idatapage
int pagesize
int recordcount
int pagecount
string orderfield
}public
inte***ce
idatapageproperty }
以上**制定了兩種分頁描述
,一是直接由實現者來描述分頁資訊
,二就是通過實現的物件成員來描述分頁資訊
.但後者也是基於
idatapage
的實現擴充套件.
dal層的介面擴充套件
public
static
ilist
list(idatasession session, expressions.expression exp, idatapageproperty datapage)
public
static
ilist
list(idatasession session, expressions.expression exp, idatapage datapage) ;
}datapage.recordcount = countof(session,exp);
return list(session, exp, region, orders); }
這裡只是
nclay
的資料持久的擴充套件
,具體的實現和相關
dal層**有關
,如果是使用
sqlhelper
所需要編寫的**相對會多些和複雜些
.通過介面首先保證了物件型別的無關性
,只要實現相關介面就能進行資料查詢和分頁
;我們所說的用介面實現多繼承在這裡體現出來了
,更重要的一點是這個繼承的目的是為了和
dal組合完成資料分頁的功能.
業務邏輯層的實現
當dal
提供這個功能組合時,業務邏輯實現分頁功能就得到更進一步的簡化;邏輯物件並不需要關心資料分頁的細節,它只要實現相關分頁介面即可。
//////產品查詢邏輯
///
public
inte***ce
iproductlist : idatapageproperty
//////所屬類別
///等於匹配
///
string categoryid
//////
起始單價
///大於等於匹配
///
decimal priceform
//////
結果單價
///小於等於匹配
///
decimal priceto
//////
產品列表
///
ilist
items
} 邏輯處理**
//////查詢
///
///邏輯介面
public
void list(iproductlist view)
if (!common.isempty(view.categoryid))
if (view.priceform > 0)
if (view.priceto > 0)
view.items = exp.list(view); }
在邏輯處理裡同樣也使用介面來橋接,原因很簡單
c#不支援通過多繼承來實現物件不同的行為特性,所以採用介面來肩負著這個責任;但也是出於同乙個目的組合完成功能,邏輯和邏輯處理並沒有乙個明確的物件依賴關係,只是通過乙個介面來約定。
分頁控制項的實現
既然已經有了乙個分頁描述介面,在編寫控制項時就不需要考慮控制項依賴於某個
page
物件;直接根據介面進行檢視表現,只要控制項所在的
page
實現了相關介面分頁控制項就能夠良好的工作。
@control
language
="c#"
autoeventwireup
="true"
inherits
="nclay.web.basecontrol"
%>
@assembly
name
="nclay"
%>
@assembly
name
="nclay.web"
%>
nclay.idatapage mdatapage = null;
int spitindex = 0;
nclay.web.iformcontext context = ((nclay.web.basecontrol)this).formcontext;
if (context.view is nclay.idatapage)
mdatapage = (nclay.idatapage)context.view;
if (context.view is nclay.idatapageproperty)
mdatapage = ((nclay.idatapageproperty)context.view).datapage;
if (mdatapage == null)
mdatapage = new nclay.datapage();
object view = context.view;
%>
<
table
class
="datapage"
>
<
tr>
if(mdatapage.pageindex>0)
spitindex =mdatapage.pageindex - 2;
if (spitindex > 4)
控制項的**太多就不完全貼出來了,在控制項**中看到
idatapageparamurl
介面,這個介面是用於描述獲取相關
url引數的,如果相關物件實現了參介面控制項就會在
url中注入引數資訊,如果沒有就不作處理並不影響控制項的處理。
以上每乙個功能的橋接都使用介面的主要原因是
c#並不提供多繼承,從而導致了物件之間的整合受到一定程度上限制。通過介面可以良好地解決這個問題,但在這幾個功能中介面都是為了把幾個不同的功能組合在一起最終完成乙個完整的功能。到這裡大家可以看到使用介面來實現多繼承只是一種手段,其真正的目的是使物件之間更良好的搭配工作。
補個控制項的效果圖
TestNG在介面測試中的應用
testng在介面測試中的應用 一 介面測試 介面測試是測試系統元件間介面的一種測試,介面測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的互動點。測試的重點是要檢查資料的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關係等。如今的系統架構紛繁複雜,系統間的介面龐雜繁多,傳統的功能測試已...
Python在HTTP介面測試中的應用
http介面例子 http ip port inte ce.php?uname aaa 介面功能 根據uname引數值來返回對應的使用者名稱的基本資訊 1.用python封裝被測試 介面,對於http接 們通常會採用 get和post 2種呼叫方式去訪問,所以必須把這2種方式都封裝進去 coding...
MVC模型在介面開發中的應用理解
1 mvc的做用是把ui data logic分離解藕,理論上設計良好地mvc可以隨意替換view或model而不用改動其它 2 model為程式提供必要的資料介面,如 資料庫 本地檔案 記憶體資料 網路資料等。它不關心是什麼物件使用資料,而只關心資料對外的介面和資料內部訪問實現以及在資料變化時如何...