C#-介面(Interface)詳解

Tynam.Yang發表於2020-08-28

定義

在 C# 語言中,類之間的繼承關係僅支援單重繼承,而介面是為了實現多重繼承關係設計的。一個類能同時實現多個介面,還能在實現介面的同時再繼承其他類,並且介面之間也可以繼承。無論是表示類之間的繼承還是類實現介面、介面之間的繼承,都使用“:”來表示。

介面定義了屬性、方法和事件,這些都是介面的成員。介面只包含了成員的宣告。成員的定義是派生類的責任。介面提供了派生類應遵循的標準結構。介面定義了語法合同 "是什麼" 部分,派生類定義了語法合同 "怎麼做" 部分。

定義介面語法:

interface  介面名稱
{
    介面成員;
}

介面命名通常以 I 字母開頭,例如Itest。
介面成員,不允許使用 public、private、protected、internal 訪問修飾符,不允許使用 static、virtual、abstract、sealed 修飾符。不能定義欄位,定義的方法不能包含方法體。

示例:定義一本書的介面,有id、名稱name、定價price幾個屬性,和一個方法售賣價SalePrice()。

using System;

namespace app
{
    interface IBook
    {
        int Id { get; set; }
        string Name { get; set; }
        double Price { get; set; }
        double SalePrice(int discount);
    }
}  

實現

介面的實現與類的繼承語法格式類似,也是重寫了介面中的方法,讓其有了具體的實現內容。

實現介面語法:

class  類名 : 介面名
{
    //類中的成員以及實現介面中的成員
}

在實現介面的成員時有兩種方式,隱式實現介面成員和顯式實現介面成員。隱式實現介面成員是將介面的所有成員以 public 訪問修飾符修飾。顯式實現介面是指在實現介面時所實現的成員名稱前含有介面名稱作為字首。
下面對一本書的介面分別使用隱式實現和顯式實現。

隱式實現:

   class Book:IBook
    {
        // 隱式的實現介面中的屬性
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }

        // 隱式實現介面中的方法
        public double SalePrice(int discount)
        {
            double salePrice = Price * discount * 0.1;
                        return salePrice;
        }

    } 

隱式實現後進行執行:

    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book();
            book.Id = 1001;
            book.Name = "tynam";
            book.Price = 60;

            Console.WriteLine("id:{0}" , book.Id);
            Console.WriteLine("書名:{0}" , book.Name);
            Console.WriteLine("定價:{0}", book.Price);
            Console.WriteLine("售賣價:{0}", book.SalePrice(8));
        }
    }

  

執行後結果

id:1001
書名:tynam
定價:60
售賣價:48

顯式實現:

    class Book:IBook
    {
        public double Price { get; set; }
        // 顯示的實現介面中的屬性
        int IBook.Id { get; set; }
        string IBook.Name { get; set; }

        // 顯式實現介面中的方法
        double IBook.SalePrice(int discount)
        {
            double salePrice = Price * discount * 0.1;
                        return salePrice;
        }

    }

 

顯式實現後進行執行:

    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book();
            IBook bookDetail = book;
			bookDetail.Id = 1001;
            bookDetail.Name = "tynam";
            bookDetail.Price = 60;

            Console.WriteLine("id:{0}" , bookDetail.Id);
            Console.WriteLine("書名:{0}" , bookDetail.Name);
            Console.WriteLine("定價:{0}", bookDetail.Price);
            Console.WriteLine("售賣價:{0}", bookDetail.SalePrice(8));
        }
    }

執行後結果:

id:1001
書名:tynam
定價:60
售賣價:48

注意:介面無法直接進行例項化。 其成員由實現介面的任何類或結構來實現。

多型

使用介面實現多型 需要滿足以下兩個條件。
定義介面並使用類實現了介面中的成員。
建立介面的例項指向不同的實現類物件。

示例:定義一個介面名稱為 IBird,分別定義兩個實現類 Phoenix 和 Duck 來實現介面的成員,程式碼如下。

    interface IBird
        {
            void fly();
        }

        class Phoenix : IBird
        {
            public void fly()
            {
                Console.WriteLine("鳳凰會飛");
            }
        }

        class Duck : IBird
        {
            public void fly()
            {
                Console.WriteLine("鴨子也會飛");
            }       
        }

例項化後執行:

        class Program
        {
                static void Main(string[] args)
                {
                        IBird phoenix = new Phoenix();
                        phoenix.fly();
                        IBird duck = new Duck();
                        duck.fly();
                }
        }

執行結果:

鳳凰會飛
鴨子也會飛

  

相關文章