關於介面參考範例
介面只包含
方法、
屬性、
事件或
索引的簽章。
成員的實作 (Implementation) 是在實作介面的類別
或結構中完成,如下列範例所示:
注意在介面Interface中的成員 方法 是一個
抽象的成員喔
而我們能在繼承介面的類別中實作介面中所有方法
所以下面再interface中的方法並無實作的成員
介面在於它只是一種標記
只要有這種標記的 class,它就「必需」要 實作介面中的成員
如果沒有實作 編識器 將會錯誤唷
interface ISampleInterface//介面
{ //實作"方法"簽章之成員的介面
void SampleMethod();
}
class ImplementationClass : ISampleInterface//類別繼承介面
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()//無需使用public
{ //但需要著名方法來自於介面所以要打ISampleInterface.SampleMethod()
// Method implementation實作方法
}
static void Main()//主程式
{
// ISampleInterface介面實體化ImplementationClass子類別
ISampleInterface obj = new ImplementationClass();
// Call the member.
obj.SampleMethod();
}
}
msdn 明白說到
包含下列成員的簽章
方法、
屬性、
事件、
索引
上面範例用的是 抽象方法
而
static void Main()主程式中
將實作介面抽象方法中的成員
介面可以繼承一個或多個基底介面。
介面會繼承其基底介面的所有成員。下面這個範例
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
interface IListBox: IControl
{
void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}
IComboBox 的基底介面是IControl、ITextBox和 IListBox
。
也就是說,以上範例中的 IComboBox介面會繼承 SetText和 SetItems 及 Paint 等成員。
實作介面的類別或結構也隱含實作介面的所有基底介面。
下列範例示範了介面實作。在這個範例中,介面包含屬性宣告抽象,類別則包含實作。
public interface IPoint //介面都是公開的,就算不打public也是默認
{
// Property signatures:
int xxx//抽象成員
{
get;
set;
}
int y//抽象成員
{
get;
set;
}
//XXX與Y將在POINT中實作
}
class Point : IPoint
{
// Fields:
private int _x;//私用
private int _y;//私用 提供Point公開方法中xx,yy的存取
// Constructor:
public Point(int xx, int yy)// 初始化本類別可帶入的參數
{
_x = xx;
_y = yy;
}
// Property implementation:
//下面開始實行介面的成員
//因為介面是公開的 所以
public int xxx //實作公開介面成員
{
get
{
return _x; //回傳私用的_X,而_X是來自 Point方法中XX的傳回值
}
set
{
_x = value;//可對_X存取
}
}
public int y //同上
{
get
{
return _y;//同上
}
set
{
_y = value;//同上
}
}
}
private void button2_Click(object sender, EventArgs e)
{//按鍵BUTTON觸發
Point p = new Point(2, 3);//實體化類別並存取2,3
MessageBox.Show("My Point: ");
MessageBox.Show("X="+p.xxx + "Y=" + p.y);//並呼叫實作的介面
}
我們注意到 介面中抽象成員
並在類別中實作成員回傳對象
//
Point p = new Point(2, 3);
類別並且存取數值2,3
在呼叫類別中實作的介面
並且MESSAGEBOX.SHOW輸出
上面只是基本的 抽象介面在類別中實作
下面將實作介面的優點
疑難解惑:
再探討interface中 遇到問題紀錄如下
假如在interface宣告了一個 方法與一個字串
如下
interface IterF
{
void Test
Method(); //方法
int Xxx { get; set; } //字串
}
//再來 在類別中實作
public class myclass:IterF
{
public Test
Method()
{
MessageBox.Show("呼叫實作介面方法成功");
}
public int Xxx
{
get {return 50;}//呼叫我 就回傳預設值50
set {Xxx = value; }//Xxx可以更改預設值
}
//在類別中 實作 介面成員 沒問題吧! 都可以成功運行
來看觸發控制鈕 何實體化這類別
private void button1_Click(object sender, EventArgs e)
{
myclass ML=new myclass();//實體化 類別
ML.Test
Method();// 輸出MessageBox.Show("呼叫實作介面方法成功")
MessageBox.Show(ML.Xxx.Tostring());//SHOW出50
}
但重點來了 有些文章中 卻不是這樣 實體化類別的
有的可能會這樣打
在疑惑好幾天之後找到原因如下
IterF ML=new myclass(); //宣告介面在實體化類別
一樣可以呼叫
ML.Test
Method();
與 MessageBox.Show(ML.Xxx.Tostring());
仔細想想 介面只能宣告
卻不能實體化
那就代表著 一個介面 可以透過類別實體化
而使用完再去 實體化 別的類別
各自呼叫類別中所定義的介面成員
再來看下列範例吧
interface IFACE//介面
{
void TestFc();//抽象方法 尚未定義
string tesS { get; set; }
}
public class ONE:IFACE //類別一 繼承IFACE
{ //類別1中 定義介面中的方法
public void TestFc()
{
MessageBox.Show("這是類別一");
}
public string tesS
{
get
{
return "OK";
}
set
{
tesS = value;
}
}
}
public class TWO : IFACE //類別二 繼承IFACE
{ //類別二 重新定義 TestFc()的方法
public void TestFc()
{
MessageBox.Show("這是類別二");
}
public string tesS
{
get
{
return "NO";
}
set
{
tesS = value;
}
}
}
BUTTON 觸發 以下是宣告方法
private void button1_Click(object sender, EventArgs e)
{
IFACE F = new ONE();//宣告介面 並且 實體化類別一
F.TestFc();//這是類別一中的方法
MessageBox.Show(F.tesS.ToString());//呼叫此類中的字串
F = new TWO();//將類別二指派給 介面
F.TestFc();//類別中方法二
MessageBox.Show(F.tesS.ToString());//同上
//所以我可以透過介面自由調動 CLASS中的方法
}
恩~目前還想不到 疑慮 或 技術
想到日後再補充