接口:
什么是接口:
在構(gòu)建類的過程中,經(jīng)常會遇到一種特殊的情況,在描述某個(gè)類的各個(gè)方法時(shí)凿菩,對每個(gè)方法我們只能給出其功能實(shí)現(xiàn)的要求(原形聲明)但不能給出具體的功能實(shí)現(xiàn)(函數(shù)定義體)。因?yàn)槲覀兯幚淼膯栴}只是一個(gè)泛泛的功能說明,并沒有針對某一具體類型的問題來說明极颓。
接口: ???
一組只有成員方法聲明沒有方法體的方法集。 ???
接口中可寫的內(nèi)容:
方法群嗤、屬性菠隆、索引器、事件
接口的作用:
提供了完全的抽象
規(guī)定類應(yīng)具有的形式
接口中的方法在多個(gè)實(shí)現(xiàn)接口的類中表現(xiàn)出多態(tài)性
便于設(shè)計(jì)狂秘、管理骇径、協(xié)作項(xiàng)目
要點(diǎn):類似于類的定義格式,只是以 interface作為定義符者春。
格式:
[訪問修飾符] interface 接口名
{?
返回值類型 方法名([參數(shù)列表]);(只有聲明而無方法體)
}
或:
// 多繼承模式:
[訪問修飾符] interface 派生的接口名 : 父接口名列表
{ ????
返回值類型 方法名([參數(shù)列表]);(只有聲明而無方法體)
}
注意事項(xiàng):
接口中聲明的方法都是默認(rèn)public的 不能自定義訪問級別
示例:
public interface Dispaly
{
???? void ViewImage();
}
語法:
// 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
class 類名 : 接口1破衔,接口2,接口3钱烟,......(,分割)
{
???? // 所有接口定義方法的實(shí)現(xiàn)
}
// 一個(gè)接口可以被多個(gè)類實(shí)現(xiàn):
class 類1 : 接口1
{
???? // 接口定義方法的實(shí)現(xiàn)
}
class 類2 : 接口1
{
???? // 接口定義方法的實(shí)現(xiàn)
}
class 類3 : 接口1
{
???? // 接口定義方法的實(shí)現(xiàn)
}
class 類4 : 接口1
{
???? // 接口定義方法的實(shí)現(xiàn)
}
實(shí)現(xiàn)原則:
實(shí)現(xiàn)的方法必須與接口中的原型定義保持一致
必須實(shí)現(xiàn)接口中的所有成員方法
實(shí)現(xiàn)方式:隱式實(shí)現(xiàn)晰筛、顯式實(shí)現(xiàn)
隱式實(shí)現(xiàn):
interface Animal
{
void Eat();
}
class Cat : Animal
{
// 隱式實(shí)現(xiàn)在類中無法辨識該方法是那個(gè)接口的
public void Eat()
{
}
}
顯式實(shí)現(xiàn):
interface Animal
{
void Sleep();
}
class Dog : Animal
{
// 顯式實(shí)現(xiàn)在類中明確方法是那個(gè)接口的
void Animal.Eat()
{
}
}
顯式\隱式的選擇:
若實(shí)現(xiàn)的所有方法均無重名,使用隱式
若實(shí)現(xiàn)的所有方法中出現(xiàn)重名拴袭,使用顯式
接口中的方法在實(shí)現(xiàn)類中呈現(xiàn)多態(tài)性:
例如:
動物吃:
接口回調(diào):接口引用=實(shí)現(xiàn)類對象
含義:
接口也是引用數(shù)據(jù)類型读第,可以指向任意實(shí)現(xiàn)了該接口的類實(shí)例
作用:
統(tǒng)一管理實(shí)現(xiàn)類對象
訪問顯式實(shí)現(xiàn)的方法
注意:
顯式實(shí)現(xiàn)的方法只能用接口回調(diào)來調(diào)用到
無法用實(shí)現(xiàn)類引用調(diào)用到
示例:
public interface IHello
{
void Bellow();
}
// 顯式接口實(shí)現(xiàn)
public class Speak : IHello
{
void IHello.Bellow()
{
Console.WriteLine("Hello");
}
}
class MainClass
{
public static void Main (string[] args)
{
Speak speak = new Speak();
//speak.Bellow() error
(speak as IHello).Bellow();// 不安全
? ? ? //原因:有可能出現(xiàn)空指針異常
IHello ih = speak as IHello;
if (ih != null)
{
ih.Bellow();//安全
}
}
}
抽象類和接口的區(qū)別:
1.接口用interface來定義,而不是class
2.接口不能創(chuàng)建實(shí)例拥刻,抽象類可以間接實(shí)例化(通過子類)
3.抽象的程度:接口完全抽象 抽象類部分抽象
4.接口采用多重繼承機(jī)制怜瞒,類采用單一的繼承機(jī)制
索引器:
[訪問修飾符] 返回值類型 this[任意數(shù)據(jù)類型 index]{set{} get{}}
實(shí)質(zhì):方法的變異品種
作用:訪問方法從對象.方法名(參數(shù))=>對象[參數(shù)]
索引器擴(kuò)展了索引訪問的方式
自定義索引器 VS 數(shù)組索引器:
(1)索引器的索引值(Index)類型不受限制
(2)索引器允許重載
(3)索引器不是一個(gè)變量
索引器 VS 屬性
(1)屬性以名稱來標(biāo)識,索引器以函數(shù)形式標(biāo)識
(2)索引器可以被重載般哼,屬性不可以
(3)索引器不能聲明為static盼砍,屬性可以
語法定義:
要聲明類或結(jié)構(gòu)上的索引器尘吗,請使用 this 關(guān)鍵字:
// Indexer declaration
// 最少有一個(gè)參數(shù)
public 數(shù)據(jù)類型 this[形參1,形參2......] ???
{
???// get and set accessors
get
{
}
set
{
// 使用隱參value接收實(shí)際參數(shù)
}
}
接口中聲明索引器的方法:
數(shù)據(jù)類型 this [【參數(shù)列表】最少有一個(gè)參數(shù)]{set;get;}