C#介面interface

taogchan發表於2013-09-05
什麼是介面?其實,介面簡單理解就是一種約定,使得實現介面的類或結構在形式上保持一致。個人覺得,使用介面可以使程式更加清晰和條理化,這就是介面的好處,但並不是所有的程式語言都支援介面,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兩個介面所有的方法宣告。即:

C#介面interfaceclass CurrentAccount : ITransferBankAccount
C#介面interface
{
C#介面interface    
private decimal balance;
C#介面interface
C#介面interface    
public decimal Balance
C#介面interface    
{
C#介面interface        
get
C#介面interface        
{
C#介面interface            
return balance;
C#介面interface        }

C#介面interface    }

C#介面interface
C#介面interface    
public void PayIn(decimal amount)
C#介面interface    
{
C#介面interface        balance 
+= amount;
C#介面interface    }

C#介面interface
C#介面interface    
public bool Withdraw(decimal amount)
C#介面interface    
{
C#介面interface        
if (balance >= amount)
C#介面interface        
{
C#介面interface            balance 
-= amount;
C#介面interface            
return true;
C#介面interface        }

C#介面interface        Console.WriteLine(
"Withdraw failed.");
C#介面interface        
return false;
C#介面interface    }

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

C#介面interface
C#介面interface    
public bool TransferTo(IBankAccount destination, decimal amount)
C#介面interface    
{
C#介面interface        
if (Withdraw(amount))
C#介面interface        
{
C#介面interface            destination.PayIn(amount);
C#介面interface            
return true;
C#介面interface        }

C#介面interface        
else
C#介面interface        

C#介面interface            
return false;
C#介面interface        }

C#介面interface    }

C#介面interface}

  總結起來說,使用C#介面應注意幾個問題:

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

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

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

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

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-772223/,如需轉載,請註明出處,否則將追究法律責任。

相關文章