2013年9月1日 星期日

interface介面

關於介面參考範例

介面只包含方法屬性事件索引的簽章。
成員的實作 (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 TestMethod();  //方法
     int Xxx { get; set; } //字串
 }
//再來 在類別中實作

public class myclass:IterF
       {
            public TestMethod()
            {
                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.TestMethod();// 輸出MessageBox.Show("呼叫實作介面方法成功")
   MessageBox.Show(ML.Xxx.Tostring());//SHOW出50
}

但重點來了 有些文章中 卻不是這樣 實體化類別的
有的可能會這樣打
在疑惑好幾天之後找到原因如下

IterF ML=new myclass(); //宣告介面在實體化類別
一樣可以呼叫
ML.TestMethod();
與 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中的方法
}

恩~目前還想不到 疑慮 或 技術
想到日後再補充

沒有留言:

張貼留言