C#有關介面的語法知識詳解

搭建bc介面API系統演示發表於2022-05-11

什麼是介面?其實,介面簡單理解就是一種約定,使得實現介面的類或結構在形式上保持一致。個人覺得,使用介面可以使程式更加清晰和條理化,這就是介面的好處,但並不是所有的程式語言都支援介面,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#有關介面的語法知識詳解 class  CurrentAccount : ITransferBankAccount
C#有關介面的語法知識詳解
{
C#有關介面的語法知識詳解    
private   decimal  balance;
C#有關介面的語法知識詳解
C#有關介面的語法知識詳解    
public   decimal  Balance
C#有關介面的語法知識詳解    
{
C#有關介面的語法知識詳解        
get
C#有關介面的語法知識詳解        
{
C#有關介面的語法知識詳解            
return  balance;
C#有關介面的語法知識詳解        }

C#有關介面的語法知識詳解    }

C#有關介面的語法知識詳解
C#有關介面的語法知識詳解    
public   void  PayIn( decimal  amount)
C#有關介面的語法知識詳解    
{
C#有關介面的語法知識詳解        balance 
+=  amount;
C#有關介面的語法知識詳解    }

C#有關介面的語法知識詳解
C#有關介面的語法知識詳解    
public   bool  Withdraw( decimal  amount)
C#有關介面的語法知識詳解    
{
C#有關介面的語法知識詳解        
if  (balance  >=  amount)
C#有關介面的語法知識詳解        
{
C#有關介面的語法知識詳解            balance 
-=  amount;
C#有關介面的語法知識詳解            
return   true ;
C#有關介面的語法知識詳解        }

C#有關介面的語法知識詳解        Console.WriteLine(
" Withdraw failed. " );
C#有關介面的語法知識詳解        
return   false ;
C#有關介面的語法知識詳解    }

C#有關介面的語法知識詳解
C#有關介面的語法知識詳解    
public   override   string  ToString()
C#有關介面的語法知識詳解    
{
C#有關介面的語法知識詳解        
return  String.Format( " Jupiter Bank Saver:Balance={0,6:C} " , balance);
C#有關介面的語法知識詳解    }

C#有關介面的語法知識詳解
C#有關介面的語法知識詳解    
public   bool  TransferTo(IBankAccount destination,  decimal  amount)
C#有關介面的語法知識詳解    
{
C#有關介面的語法知識詳解        
if  (Withdraw(amount))
C#有關介面的語法知識詳解        
{
C#有關介面的語法知識詳解            destination.PayIn(amount);
C#有關介面的語法知識詳解            
return   true ;
C#有關介面的語法知識詳解        }

C#有關介面的語法知識詳解        
else
C#有關介面的語法知識詳解        

C#有關介面的語法知識詳解            
return   false ;
C#有關介面的語法知識詳解        }

C#有關介面的語法知識詳解    }

C#有關介面的語法知識詳解}

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

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

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

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

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

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


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

相關文章