C#學習之介面

來源:互聯網
上載者:User
  什麼是介面?其實,介面簡單理解就是一種約定,使得實現介面的類或結構在形式上保持一致。個人覺得,使用介面可以使程式更加清晰和條理化,這就是介面的好處,但並不是所有的程式設計語言都支援介面,C#是支援介面的。注意,雖然在概念上,C#介面類似於COM介面,但他們的底層結構是不同的。那麼,我們來看一下如何聲明和使用介面。

  聲明介面

  聲明介面在文法上和聲明抽象類別完全相同,例如這裡有一個銀行賬戶的介面:
  

public interface IBankAccount
{
    void PayIn(decimal amount);
    bool Withdraw(decimal amount);

    decimal Balance
    {
        get;
    }
}

  注意:介面中只能包含方法、屬性、索引器和事件的聲明。不允許聲明成員上的修飾符,即使是pubilc都不行,因為介面成員總是公有的,也不能聲明為虛擬和靜態。如果需要修飾符,最好讓實作類別來聲明。

  使用介面的例子

  這是書上的一個簡單的例子,但足以說明介面的使用方法。
  一個銀行賬戶的介面,兩個不同銀行賬戶的實作類別,都繼承於這個介面。介面聲明如上。下面是兩個賬戶類:

class SaverAccount : IBankAccount
{
    private decimal balance;

    public decimal Balance
    {
        get 
        {
            return balance;    
        }
    }

    public void PayIn(decimal amount)
    {
        balance += amount;
    }

    public bool Withdraw(decimal amount)
    {
        if (balance >= amount)
        {
            balance -= amount;
            return true;
        }
        Console.WriteLine("Withdraw failed.");
        return false;
    }

    public override string ToString()
    {
        return String.Format("Venus Bank Saver:Balance={0,6:C}", balance);
    }
}

class GoldAccount : IBankAccount
{
    private decimal balance;

    public decimal Balance
    {
        get 
        {
            return balance;
        }
    }

    public void PayIn(decimal amount)
    {
        balance += amount;
    }

    public bool Withdraw(decimal amount)
    {
        if (balance >= amount)
        {
            balance -= amount;
            return true;
        }
        Console.WriteLine("Withdraw failed.");
        return false;
    }

    public override string ToString()
    {
        return String.Format("Jupiter Bank Saver:Balance={0,6:C}", balance);
    }
}

  可見,這兩個實作類別多繼承了IBankAccount介面,因此它們必須要實現介面中的所有聲明的方法。要不然,編譯就會出錯。讓我們來測試一下,下面是測試代碼:

static void Main(string[] args)
{
    IBankAccount venusAccount = new SaverAccount();
    IBankAccount jupiterAccount = new CurrentAccount();
    venusAccount.PayIn(200);
    jupiterAccount.PayIn(500);
    Console.WriteLine(venusAccount.ToString());
    jupiterAccount.PayIn(400);
    jupiterAccount.Withdraw(500);
    jupiterAccount.Withdraw(100);
    Console.WriteLine(jupiterAccount.ToString());

}

  請注意開頭兩句,我們把它們聲明為IBankAccount引用的方式,而沒有聲明為類的引用,為什麼呢?因為,這樣我們就可以讓它指向執行這個介面的任何類的執行個體了,比較靈活。但這也有個缺點,如果我們要執行不屬於介面的方法,比如這裡重載的ToString()方法,就要先把介面的引用強制轉換成合適的類型了。

  介面的繼承

  介面也可以彼此繼承,就象類的繼承一樣。比如我們又聲明一個介面ITransferBankAccount,它繼承於IBankAccount介面。

interface ITransferBankAccount : IBankAccount 
{
    bool TransferTo(IBankAccount destination, decimal amount);
}

  在這個介面中,又新增加了一個方法TransferTo(),所以如果我們要寫一個類從ITransferBankAccount繼承的話,就必須要實現IBankAccount和ITransferBankAccount兩個介面所有的方法聲明。即:

class CurrentAccount : ITransferBankAccount
{
    private decimal balance;

    public decimal Balance
    {
        get
        {
            return balance;
        }
    }

    public void PayIn(decimal amount)
    {
        balance += amount;
    }

    public bool Withdraw(decimal amount)
    {
        if (balance >= amount)
        {
            balance -= amount;
            return true;
        }
        Console.WriteLine("Withdraw failed.");
        return false;
    }

    public override string ToString()
    {
        return String.Format("Jupiter Bank Saver:Balance={0,6:C}", balance);
    }

    public bool TransferTo(IBankAccount destination, decimal amount)
    {
        if (Withdraw(amount))
        {
            destination.PayIn(amount);
            return true;
        }
        else
        { 
            return false;
        }
    }
}  總結起來說,使用C#介面應注意幾個問題:

  1、C#中的介面是獨立於類來定義的。這與 C++模型是對立的,在 C++中介面實際上就是抽象基類。

  2、介面和類都可以繼承多個介面。

  3、類可以繼承一個基類,介面根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現衝突。因此也不再需要諸如虛擬繼承和顯式範圍這類複雜機制。C#的簡化介面模型有助於加快應用程式的開發。

  4、一個介面定義一個只有抽象成員的參考型別。C#中一個介面實際所做的,僅僅只存在著方法標誌,但根本就沒有執行代碼。這就暗示了不能執行個體化一個介面,只能執行個體化一個派生自該介面的對象。

  5、介面可以定義方法、屬性和索引。所以,對比一個類,介面的特殊性是:當定義一個類時,可以派生自多重介面,而你只能可以從僅有的一個類派生。

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.