對了,玩了一段時間的部落格,現在一直發表的都是比較基礎的C#的知識,等基礎發表結束之後我會繼續發表一些關於項目上的東東,由於本人仍在學習中,有錯誤和不足的地方,請大家批評指正。非常感謝各位!
今天就來簡單的介紹下介面的基本概念及用法:
1、介面的概念及聲明
介面是一種用來定義程式的協議,它描述可屬於任何類或結構的一組相關行為。介面可有方法、屬性、事件和索引器或這四種成員的任何組合類別型,但不能包含欄位。
那麼介面具有哪些特點呢?
·介面類似於抽象基類:繼承介面的任何非抽象類別型都必須實現介面的所有成員(說明:如類A繼承介面B,那麼A中必須實現B中定義的屬性,方法等)。
·不能直接執行個體化介面
·介面可以包含事件、索引器、方法和屬性
·介面不包含方法的實現
·類和介面可以從多個介面繼承
·介面自身可以繼承多個介面
在聲明介面時除了Interface和介面名稱是必須的,其他都是可選項。另可使用new、public、protected、intenal和private等修飾符實現介面,但介面成員必須是公用的。
2、介面的實現與繼承
聲明實現介面的類時,需要在基類列表中包含類所實現的介面的名稱。
下面舉個小例子來探討下:
using System;
using System.Collections.Generic;
using System.Text;
namespace _
{
interface ImyInterface
{
/// <summary>
/// 編號(可讀可寫)
/// </summary>
string ID
{
get;
set;
}
/// <summary>
/// 姓名(可讀可寫)
/// </summary>
string Name
{
get;
set;
}
/// <summary>
/// 顯示定義的編號和姓名
/// </summary>
void ShowInfo();
}
class Program:ImyInterface//繼承自介面
{
string id = "";
string name = "";
/// <summary>
/// 編號
/// </summary>
public string ID
{
get
{
return id;
}
set
{
id = value;
}
}
/// <summary>
/// 姓名
/// </summary>
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
/// <summary>
/// 顯示定義的編號和姓名
/// </summary>
public void ShowInfo()
{
Console.WriteLine("編號\t 姓名");
Console.WriteLine(ID + "\t " + Name);
}
static void Main(string[] args)
{
Program program = new Program(); //執行個體化Program類對象
ImyInterface imyinterface = program; //使用衍生類別對象執行個體化介面ImyInterface
imyinterface.ID = "TM"; //為衍生類別中的ID屬性賦值
imyinterface.Name = "C# 2.0從入門到應用開發"; //為衍生類別中的Name屬性賦值
imyinterface.ShowInfo(); //調用衍生類別中方法顯示定義的屬性值
}
}
}
上面的這個例子是一個簡單的一個類繼承一個介面,如要實現介面類中對應的成員必須是公用的、非靜態,並且與介面成員具有相同的名稱和簽名。並且介面的執行個體化不能像類那樣Program program = new Program();其中上述程式中紅色部分即為介面的執行個體化(使用衍生類別對象執行個體化介面)。
單一繼承時這樣的,那麼多重繼承呢?OK,我們來看下個例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace _
{
interface IPeople
{
/// <summary>
/// 姓名
/// </summary>
string Name
{
get;
set;
}
/// <summary>
/// 性別
/// </summary>
string Sex
{
get;
set;
}
}
interface ITeacher:IPeople //繼承公用介面
{
/// <summary>
/// 教學方法
/// </summary>
void teach();
}
interface IStudent:IPeople //繼承公用介面
{
/// <summary>
/// 學習方法
/// </summary>
void study();
}
class Program:IPeople,ITeacher,IStudent//多介面繼承
{
string name = "";
string sex = "";
/// <summary>
/// 姓名
/// </summary>
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
/// <summary>
/// 性別
/// </summary>
public string Sex
{
get
{
return sex;
}
set
{
sex = value;
}
}
/// <summary>
/// 教學方法
/// </summary>
public void teach()
{
Console.WriteLine(Name + " " + Sex + " 教師");
}
/// <summary>
/// 學習方法
/// </summary>
public void study()
{
Console.WriteLine(Name + " " + Sex + " 學生");
}
static void Main(string[] args)
{
Program program = new Program(); //執行個體化類對象
ITeacher iteacher = program; //使用衍生類別對象執行個體化介面ITeacher
iteacher.Name = "TM";
iteacher.Sex = "男";
iteacher.teach();
IStudent istudent = program; //使用衍生類別對象執行個體化介面IStudent
istudent.Name = "C#";
istudent.Sex = "男";
istudent.study();
}
}
}
上述的多重繼承中說明了,在衍生類別中必須實現所繼承的介面中的所有方法。OK,單一繼承和多重繼承都有了瞭解之後,是不是沒有其他的需要瞭解的呢?試想一下,如果在一個類A繼承自介面B和C,並且在B和C中包含具有相同簽名的成員,那麼在類中實現該成員將導致兩個介面都使用該成員作為他們的實現,然而,如果兩個介面成員實現不同的功能,那麼將會導致一個介面的成員實現不正確或兩個介面的成員實現都不正確,這個時候我們應該如何處理呢?我們可以顯示的實現介面成員,即建立一個僅通過介面調用並且特定於該介面的類成員。
下面也是一個通過一個執行個體來說明
using System;
using System.Collections.Generic;
using System.Text;
namespace _
{
interface ImyInterface1
{
/// <summary>
/// 求和方法
/// </summary>
/// <returns>加法運算的和</returns>
int Add();
}
interface ImyInterface2
{
/// <summary>
/// 求和方法
/// </summary>
/// <returns>加法運算的和</returns>
int Add();
}
class myClass : ImyInterface1, ImyInterface2 //繼承介面
{
/// <summary>
/// 求和方法
/// </summary>
/// <returns>加法運算的和</returns>
int ImyInterface1.Add() //顯式介面成員實現
{
int x = 3;
int y = 5;
return x + y;
}
/// <summary>
/// 求和方法
/// </summary>
/// <returns>加法運算的和</returns>
int ImyInterface2.Add() //顯式介面成員實現
{
int x = 3;
int y = 5;
int z = 7;
return x + y + z;
}
}
class Program
{
static void Main(string[] args)
{
myClass myclass = new myClass(); //執行個體化介面繼承類的對象
ImyInterface1 imyinterface1 = myclass; //使用介面繼承類的對象執行個體化介面
Console.WriteLine(imyinterface1.Add()); //使用介面對象調用介面中方法
ImyInterface2 imyinterface2 = myclass; //使用介面繼承類的對象執行個體化介面
Console.WriteLine(imyinterface2.Add()); //使用介面對象調用介面中方法
}
}
}
上面的執行個體中在Myclass類中,通過兩個顯示介面成員的方法分別實現了兩個介面中的Add方法,在執行個體化不同的介面後,調用相應的方法實現輸出結果。