成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C#中的接口問(wèn)題

開(kāi)發(fā) 后端
本文主要對(duì)C#中的空接口的使用和接口的成員為什么沒(méi)有委托做了簡(jiǎn)單解析。

接口的相關(guān)陳述

◆ 一個(gè)接口定義了一個(gè)契約;

◆ 接口可以包容方法、C#屬性、事件、以及索引器;

◆ 在一個(gè)接口聲明中,我們可以聲明零個(gè)或者多個(gè)成員;

◆ 所有接口成員的默認(rèn)訪問(wèn)類(lèi)型都是public;

◆ 如果在接口成員聲明中包括了任何修飾符,那么會(huì)產(chǎn)生一個(gè)編譯器錯(cuò)誤;

◆ 與一個(gè)非抽象類(lèi)類(lèi)似,一個(gè)抽象類(lèi)必須提供接口中所有成員的實(shí)現(xiàn),只要這些成員在這個(gè)類(lèi)的基類(lèi)中出現(xiàn)過(guò)。

接口的理解

1. 面向接口編程利用OO的一個(gè)基本性質(zhì)——多態(tài),相同方法不同表現(xiàn)。可以這樣想一下,client編寫(xiě)自己程序的時(shí)候,如果直接面向一個(gè)具體類(lèi)寫(xiě)程序,那這個(gè)程序有個(gè)風(fēng)吹草動(dòng)的,那client就要受到影響,但如果面向一個(gè)接口就不同了,某個(gè)具體類(lèi)變了,只知接口,不知具體類(lèi)的client就可以完全不動(dòng)。 都說(shuō)上層領(lǐng)導(dǎo)比較好當(dāng),因?yàn)榭梢愿傻氖峦ǔ?duì)老百姓來(lái)說(shuō)是虛的,越虛就越不容易錯(cuò)。 這個(gè)道理在OO中也是適用的。

2. 換個(gè)視角看,面向接口編程反映OO的另一個(gè)方面——封裝,接口將具體實(shí)現(xiàn)封裝了起來(lái),可以不影響客戶的情況下切換實(shí)現(xiàn)

3. 接口的作用,一言以蔽之,就是標(biāo)志類(lèi)的類(lèi)別(type of class)。把不同類(lèi)型的類(lèi)歸于不同的接口,可以更好的管理他們。OO的精髓,我以為,是對(duì)對(duì)象的抽象,最能體現(xiàn)這一點(diǎn)的就是接口。為什么我們討論設(shè)計(jì)模式都只針對(duì)具備了抽象能力的語(yǔ)言(比如c++、java、c#等),就是因?yàn)樵O(shè)計(jì)模式所研究的,實(shí)際上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似調(diào)侃,實(shí)乃至理)。

空接口的使用

在接口使用的時(shí)候,空接口有2種情況:

1. 類(lèi)似于ObjectBuilder中的IBuilderPolicy,他們往往是做一個(gè)標(biāo)記,表示需要某個(gè)功能.當(dāng)然你也可以這么用,來(lái)表示你的類(lèi)具有某個(gè)功能,實(shí)現(xiàn)了你的某個(gè)接口。

namespace Microsoft.Practices.ObjectBuilder
{
     /// <summary>
     /// Represents a builder policy interface. Since there are no fixed requirements
     /// for policies, it acts as a marker interface from which to derive all other
     /// policy interfaces.
     /// </summary>
     public interface IBuilderPolicy
     {
     }
}namespace Microsoft.Practices.ObjectBuilder
{
     /// <summary>
     /// Represents a builder policy interface. Since there are no fixed requirements
     /// for policies, it acts as a marker interface from which to derive all other
     /// policy interfaces.
     /// </summary>
     public interface IBuilderPolicy
     {
     }
}

2. 你的接口繼承了別的接口(非空),你的接口本身沒(méi)有聲明函數(shù).這種情況一般是你不希望用戶使用父接口作為參數(shù)類(lèi)型,因?yàn)樗麄兊挠猛究赡懿煌?此時(shí)就可以用空接口來(lái)實(shí)現(xiàn).

interface Text
{
    string getText();
}
 
interface SqlText : Text
{
      
}

可以看到,Text接口是用于返回一個(gè)字符串.而SqlText是一個(gè)空接口,它繼承了Text接口.也就是說(shuō)SqlText也是一種Text.但是我們可以知道,任何一個(gè)字符串不一定是Sql字符串,所以此時(shí)聲明了一個(gè)SqlText接口來(lái)用于表名當(dāng)前的字符串是一個(gè)Sql字符串.你的函數(shù)可以這樣聲明:

public void doQuery(SqlText sqlText)

而不是這樣:

public void doQuery(Text text)

避免用戶產(chǎn)生歧義的想法,一眼看去,就明白應(yīng)該傳入一個(gè)Sql字符串.

#p#

接口的成員為什么沒(méi)有委托

我們都知道C#的接口是可以包含事件的,其實(shí)當(dāng)我們看到事件的時(shí)候,很容易就會(huì)想到委托,委托是事件的基礎(chǔ),如果對(duì)委托和事件不是特別清楚的程序員就一定不會(huì)明白,為什么C#接口中可以包含事件而不能有委托呢。其實(shí)簡(jiǎn)單的說(shuō)法就是委托也是類(lèi)型,delegate關(guān)鍵字引入的是一個(gè)新的類(lèi)型,所以一個(gè)C#接口無(wú)法包容一個(gè)委托并把它當(dāng)作成員;而event關(guān)鍵字引入的是一個(gè)新的成員,因此事件可以歸人接口。理解這點(diǎn),我們要從C#接口的使命說(shuō)起,C#接口是一個(gè)契約,規(guī)范了接口實(shí)現(xiàn)者的行為,而不是要有些什么。很簡(jiǎn)單,例如“黨員”是個(gè)接口,它肯定有個(gè)動(dòng)作是“為人民服務(wù)”,“某某黨員”實(shí)現(xiàn)了“黨員” 這個(gè)接口,那么“某某黨員”肯定也要“為人民服務(wù)”,至于你“某某黨員”是否必須擁用“電腦”、“小孩”。那么“黨員”這個(gè)接口中肯定不會(huì)有規(guī)定。這也就 是接口的目的,規(guī)范了實(shí)現(xiàn)者的一些行為。所以C#接口的成員都是方法,不會(huì)有其它了。稍有c#常識(shí)的程序員都明白,c#中的屬性,其實(shí)就是兩個(gè)方法,一個(gè)Set方法,一個(gè)Get方法,同樣事件和索引器也都是方法,請(qǐng)看下面的接口:

public interface IDrawingObject
    {
        event EventHandler OnDraw;
        string Name
        {
            get;
            set;
        }
        int this[int index]
        {
            get;
            set;
        }
        void SetValue();
    }

該接口包含了c#接口所能接納的所有成員,事件,屬性,索引器,方法。把該接口編譯后,我們用MSIL Disassembler工具查看一下:

這下大家都明白了,其實(shí)屬性Name對(duì)應(yīng)于Get_Name(),Set_Name()這兩個(gè)方法,事件OnDraw對(duì)應(yīng)于add_OnDraw(),remove_OnDraw()這兩個(gè)方法,索引器對(duì)應(yīng)于get_Item(),set_Item()這兩個(gè)方法。在看下面的委托和類(lèi)的定義:

public delegate void TestEventDelegate(object sender, System.EventArgs e);
class TestClass
    {
        public void SetValue()
        { }
}

看到了吧,定義一個(gè)委托和定義一個(gè)類(lèi)是沒(méi)有什么區(qū)別的,都是定義了個(gè)新的類(lèi)型。所以C#接口是不能有委托的,除非微軟告訴我們C#接口中是可以定義類(lèi)的。

【編輯推薦】

  1. C#中的Namespace詳解
  2. 深入理解C# 3.0的五項(xiàng)主要改進(jìn)
  3. 淺談C# 4.0中的動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)編程
責(zé)任編輯:楊鵬飛 來(lái)源: ilove789110的專(zhuān)欄
相關(guān)推薦

2009-08-14 17:58:05

C#接口方法

2009-09-02 14:18:08

C#聲明COM接口

2009-08-10 10:04:25

C#抽象類(lèi)C#接口

2009-07-31 13:48:34

C# eval()函數(shù)

2009-05-08 09:46:37

微軟C#集合對(duì)象

2025-03-19 07:48:07

C# 13params參數(shù)

2009-08-20 18:30:33

C# ReaderWr

2011-09-21 10:56:31

C#結(jié)構(gòu)

2009-08-03 15:06:43

C# Stack對(duì)象C# Queue對(duì)象

2009-09-17 17:13:54

C#數(shù)組

2009-08-14 10:51:43

2009-06-24 10:49:16

JavaScript

2009-08-07 11:26:53

C#數(shù)組結(jié)構(gòu)

2009-08-12 11:24:25

C# String對(duì)象

2009-08-31 09:37:09

C# Employee

2009-08-19 17:12:18

C# Connecti

2009-08-26 13:15:38

C#選擇控制

2009-08-20 10:24:52

C#開(kāi)發(fā)WinForm

2009-08-25 16:16:43

C# oledbcon

2009-08-26 15:46:01

C#匿名類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕日韩一区二区 | 欧美11一13sex性hd| 精品日韩一区 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲国产成人精 | 久久综合久久久 | 一区观看| 亚洲精品9999久久久久 | 国产一区二区三区免费 | 99爱国产| 99综合 | 欧美激情综合 | 欧美精品网站 | 九九精品热 | 日韩福利片| 91精品国产91久久久久久吃药 | 欧美一级免费观看 | 亚洲欧美激情国产综合久久久 | 久久久久一区二区三区 | 欧美一区二区三区免费电影 | 日韩在线播放一区 | 日韩一二三区视频 | 精品日韩| 国产日韩一区二区三区 | 男女视频免费 | 成人福利在线观看 | 欧美国产激情 | 一区二区激情 | 国产精品一区二区久久精品爱微奶 | 免费一区 | 国产成人精品免高潮在线观看 | 欧美色999 | 在线一区二区三区 | 日韩精品在线播放 | 亚洲不卡在线观看 | 久久久国产一区二区三区 | 亚洲国产电影 | 激情六月丁香 | 亚洲综合视频 | 一级日批片 | 一级h片 |