C#介面interface
什麼是介面?其實,介面簡單理解就是一種約定,使得實現介面的類或結構在形式上保持一致。個人覺得,使用介面可以使程式更加清晰和條理化,這就是介面的好處,但並不是所有的程式語言都支援介面,C#是支援介面的。注意,雖然在概念上,C#介面類似於COM介面,但他們的底層結構是不同的。那麼,我們來看一下如何宣告和使用介面。
宣告介面
宣告介面在語法上和宣告抽象類完全相同,例如這裡有一個銀行賬戶的介面:
注意:介面中只能包含方法、屬性、索引器和事件的宣告。不允許宣告成員上的修飾符,即使是pubilc都不行,因為介面成員總是公有的,也不能宣告為虛擬和靜態的。如果需要修飾符,最好讓實現類來宣告。
使用介面的例子
這是書上的一個簡單的例子,但足以說明介面的使用方法。
一個銀行賬戶的介面,兩個不同銀行賬戶的實現類,都繼承於這個介面。介面宣告如上。下面是兩個賬戶類:
可見,這兩個實現類多繼承了IBankAccount介面,因此它們必須要實現介面中的所有宣告的方法。要不然,編譯就會出錯。讓我們來測試一下,下面是測試程式碼:
請注意開頭兩句,我們把它們宣告為IBankAccount引用的方式,而沒有宣告為類的引用,為什麼呢?因為,這樣我們就可以讓它指向執行這個介面的任何類的例項了,比較靈活。但這也有個缺點,如果我們要執行不屬於介面的方法,比如這裡過載的ToString()方法,就要先把介面的引用強制轉換成合適的型別了。
介面的繼承
介面也可以彼此繼承,就象類的繼承一樣。比如我們又宣告一個介面ITransferBankAccount,它繼承於IBankAccount介面。
在這個介面中,又新增加了一個方法TransferTo(),所以如果我們要寫一個類從ITransferBankAccount繼承的話,就必須要實現IBankAccount和ITransferBankAccount兩個介面所有的方法宣告。即:
總結起來說,使用C#介面應注意幾個問題:
宣告介面
宣告介面在語法上和宣告抽象類完全相同,例如這裡有一個銀行賬戶的介面:
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}
{
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);
}
}
{
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);
}
}
{
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 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);
}
{
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;
}
}
}
{
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、介面可以定義方法、屬性和索引。所以,對比一個類,介面的特殊性是:當定義一個類時,可以派生自多重介面,而你只能可以從僅有的一個類派生。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-772223/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c# interface介面C#
- c# interface介面之C#
- 瞭解下C# 介面(Interface)C#
- C#程式設計利器之三:介面(Interface)C#程式設計
- interface/介面
- public interface View介面和public interface ViewResolver介面介紹View
- 如何理解 interface 介面
- Java-介面(interface)Java
- java之介面interfaceJava
- firewalld: 介面interface操作
- C# interface abstract classC#
- java中的interface(介面)Java
- go sort.Interface 排序介面Go排序
- Interface(介面分享)第一節
- C#-介面(Interface)詳解C#
- Golang interface介面深入理解Golang
- 使用 C# 設計 Fluent InterfaceC#
- C# interface以及工廠模式C#模式
- interface 介面 -Go 學習記錄Go
- Spring Boot 注入介面 @Autowired interfaceSpring Boot
- Java介面(interface)的概念及使用Java
- 6.6 多文件介面(Multiple Document Interface)
- Golang 學習——interface 介面學習(一)Golang
- Golang 學習——interface 介面學習(二)Golang
- PHP interface(介面)的示例程式碼PHP
- JavaScript設計模式--實現介面InterfaceJavaScript設計模式
- PLC結構化文字(ST)——介面(Interface)
- 使用Golang的interface介面設計原則Golang
- 什麼是Java Marker Interface(標記介面)Java
- SAP系統裡的胖介面Fat interface
- 環回介面(loopback interface)的新認識OOP
- SAP ABAP Netweaver裡的胖介面(fat interface)
- PHP中的 抽象類(abstract class)和 介面(interface)PHP抽象
- PHP 中的抽象類(abstract class)和介面(interface)PHP抽象
- WatchKit程式設計指南:Interface Object–介面物件程式設計Object物件
- 藉助 zope.interface 深入瞭解 Python 介面Python
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- C#之介面C#