C# interface使用實(shí)例分析
C# interface使用有什么優(yōu)點(diǎn)呢?首先我們來比較下Java的interface因為有需求,所以需要自己封裝JavaEE的HttpServletRequest,HttpServletResponse加入更多的功能,例如封狀一些表單驗證,安全驗證,文件上傳等功能。
對于C# interface的理解首先我們來看看下面Java interface代碼。
- /**
 - *提供最基本的封裝策略,把POST GET數(shù)據(jù)分開處理
 - */
 - public interface BaseHttpRequest extends HttpServletRequest{
 - public String getFormString();
 - public String getFormParameter(String key);
 - public String getFormParameters(String key);
 - public String getUrlParameter(String key);
 - public String getUrlParameters(String key);
 - }
 - /**
 - * 提供安全驗證的請求策略
 - */
 - public interface SecurityHttpRequestextends HttpServletRequest{
 - /**
 - * validator input stream include xss,
 - sqlinjection or csrfthen throws exception
 - * @throws RequestValidatorException
 - */
 - public void validateRequest()throws RequestValidatorException;
 - }
 - /**
 - * 提供文件上傳自動化
 - */
 - public interface FileHttpRequest extends HttpServletRequest{
 - /**
 - * @return http post file mapping
 - */
 - public HttpFileMap getFiles();
 - }
 
那么得要把3種不同類別的HttpRequest接口 整合起來。卻想起JAVA中接口之間因為是互相繼承,而且不能多個。這樣就麻煩了 看以下代碼是錯誤的。
- public interface HttpRequest extends
 - FileHttpRequest, SecurityHttpRequest, BaseHttpRequest{
 - /**
 - * 錯誤的做法。
 - */
 - }
 
怎么辦呢?只能使用抽象類了
- public abstract class AbstractHttpRequest
 - implements BaseHttpRequest,SecurityHttpRequest,FileHttpRequest {
 - }
 
看了吧? 當(dāng)用戶需要實(shí)現(xiàn)以上統(tǒng)一的接口時候就需要繼承了這個抽象類。按照他們的功能區(qū)分為3個接口類,也是為了不要讓一個接口類非常臃腫??赡苡腥藭?直接寫一個類實(shí)現(xiàn)3個接口就可以啦!為什么非要把這些接口都集成為1個接口在實(shí)現(xiàn)?其實(shí)集成起來的目的就是為了對外接口的統(tǒng)一松耦合,組件內(nèi)高類聚。
例如可以這樣:
- AbstractHttpRequestr=(AbstractHttpRequest)request;
 - r.validateRequest();
 - r.getFiles();
 - r.getFormString();
 - ...
 
如果不對外統(tǒng)一,調(diào)用者就非常麻煩:
- BaseHttpRequestbhr=(BaseHttpRequest)request;
 - bhr.getFormString();
 - SecurityHttpRequestshr=(SecurityHttpRequest)request;
 - shr.validateRequest();
 - FileHttpRequest fhr=(FileHttpRequest)request;
 - fhr.getFiles();
 
以上是從設(shè)計角度為應(yīng)用者考慮。繼續(xù)回到剛剛使用抽象類來實(shí)現(xiàn)3個接口,而具體在設(shè)計實(shí)現(xiàn)類的時候,直接繼承 AbstractHttpRequest 抽象類不也就OK了嗎?其實(shí)這樣也不是理想的?,F(xiàn)在主流的開發(fā)語言Java C#等 都提倡面向接口,消除繼承,為什么?可以去看看《JAVA設(shè)計模式》但因為Java的語法原因,我們被逼使用繼承抽象類......接下來我們看看C# interface使用時是否如此考慮到這些問題。
以下是我寫的C# interface設(shè)計測試代碼。
- public interface RequestSecurity : ICloneable
 - {
 - void validator();
 - }
 - public interface RequestFormSetterGetter : ICloneable
 - {
 - void setForm();
 - }
 - public interface RequestFileUtil : ICloneable
 - {
 - void getFile();
 - }
 - public interface RequestAll : RequestSecurity,
 - RequestFormSetterGetter, RequestFileUtil
 - {
 - }
 - public class RequestImpl : RequestAll
 - {
 - public void validator()
 - {
 - }
 - public void setForm()
 - {
 - }
 - public void getFile()
 - {
 - }
 - public object Clone()
 - {
 - return new object();
 - }
 - }
 
編譯通過,總的來說,C#允許接口之間多重繼承。
C# interface使用的基本內(nèi)容以及C# interface使用與Java的比較就向你介紹到這里,希望對你了解和學(xué)習(xí)C# interface使用有所幫助。
【編輯推薦】















 
 
 
 
 
 
 