C#接口和编程实例
一
接口簡單理解就是一種約定,使得實現接口的類或結構在形式上保持一致。
聲明接口在語法上和聲明抽象類完全相同,例如聲明一個銀行賬戶的接口:
public interface IBankAccount
{
? ? void PayIn(decimal amount);
? ? bool Withdraw(decimal amount);
? ? decimal Balance
? ? {
? ? ? ? get;
? ? }
}
接口中只能包含方法、屬性、索引器和事件的聲明。不允許聲明成員上的修飾符,pubilc都不行,因為接口成員總是公有的,也不能聲明為虛擬和靜態的。如果需要修飾符,讓實現類來聲明。
? 1. 接口是一個引用類型,通過接口可以實現多重繼承。
? 2. C#中接口的成員不能有new、public、protected、internal、private等修飾符。
? 3. 接口中只能聲明"抽象"成員(所以不能直接下一步對接口進行實例化(即不能使用new操作符聲明一個接口的實例對 象)),而不能聲明共有的域或者私有的成員變量。
? 4. 接口聲明不包括數據成員,只能包含方法、屬性、事件、索引等成員。
? 5. 接口名稱一般都以“I”作為首字母(當然不這樣聲明也可以),這也是接口和類的一個區別之一。?
? 6. 接口成員的訪問級別是默認的(默認為public),所以在聲明時不能再為接口成員指定任何訪問修飾符,否則 編譯器會報錯。
? 7. 接口成員不能有static、abstract、override、virtual修飾符,使用new修飾符不會報錯,但會給出警告說不需要關鍵字new。
? 8. 在聲明接口成員的時候,不準為接口成員編寫具體的可執行代碼,也就是說,只要在對接口進行聲明時指明接口的成員名稱和參數就可以了。
? 9. 接口一旦被實現,實現類必須實現接口中的所有成員,除非實現類本身是抽象類(通過具體的可執行代碼實現接口抽象成員的操作)。
1、C#中的接口是獨立于類來定義的。這與 C++模型是對立的,在 C++中接口實際上就是抽象基類。
2、接口和類都可以繼承多個接口。
3、類可以繼承一個基類,接口根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復雜機制。C#的簡化接口模型有助于加快應用程序的開發。
4、一個接口定義一個只有抽象成員的引用類型。C#中一個接口實際所做的,僅僅只存在著方法標志,但根本就沒有執行代碼。這就暗示了不能實例化一個接口,只能實例化一個派生自該接口的對象。
5、接口可以定義方法、屬性和索引。所以,對比一個類,接口的特殊性是:當定義一個類時,可以派生自多重接口,而你只能可以從僅有的一個類派生。
二
IBankAccount venusAccount = new SaverAccount();
IBankAccount jupiterAccount = new CurrentAccount();
如上兩句,把它們聲明為IBankAccount引用的方式,而沒有聲明為類的引用。這樣就可以讓它指向執行這個接口的任何類的實例了,比較靈活。但這也有個缺點,如果我們要執行不屬于接口的方法,比如這里重載的ToString()方法,就要先把接口的引用強制轉換成合適的類型了。
三
接口的繼承
? ? 接口也可以彼此繼承,就象類的繼承一樣。比如我們又聲明一個接口ITransferBankAccount,它繼承于IBankAccount接口。
?
? ? 比如在這個接口中,又新增加了一個方法TransferTo(),所以如果要寫一個類從ITransferBankAccount繼承的話,就必須要實現IBankAccount和ITransferBankAccount兩個接口所有的方法聲明。
?
四 編程實例
1
using System;
namespace jiekoudemo1
{
????interface ISampleInterface
????{
????void SampleMethod();
????}
????class ImplementationClass : ISampleInterface
????{
????// Explicit interface member implementation:
????void ISampleInterface.SampleMethod()
????{
????????Console.WriteLine("我是方法實現");
????}
????}
????
????class Program
????{
????????public static void Main(string[] args)
????????{
????????????
????????????// Declare an interface instance.
????????????ISampleInterface obj = new ImplementationClass();
????????????// Call the member.
????????????obj.SampleMethod();
????????????Console.Write("按任意鍵繼續 . . . ");
????????????Console.ReadKey(true);
????????}
????}
}
?
?
2
using System;
namespace jiekoudemo2
{
????interface???IPrint???{???
???????????void???Print();???
??????}???
????
??????class???A???:???IPrint???{???
??????????public???void???Print()???{???
??????????????System.Console.WriteLine("我是A");???
??????????}???
??????}???
????
??????class???B???:???IPrint???{???
??????????public???void???Print()???{???
??????????????System.Console.WriteLine("我是B");???
??????????}???
??????}???
????
????class Program
????{
????????public???static???void???Print(IPrint???obj)???{???
??????????????obj.Print();???
??????????????}???
????????
????????public static void Main(string[] args)
????????{
????????????
??????????????????Print(new???A());???//???display???A???
??????????????????Print(new???B());???//???display???B???
??????????????????
?????????????Console.Write("按任意鍵繼續 . . . ");
????????????Console.ReadKey(true);
????????}
????}
}
?
?
3
using System;
using System.Collections.Generic;
using System.Text;
interface ImyInterface
????{
????????/// <summary>
????????/// 編號(可讀可寫)
????????/// </summary>
????????string ID
????????{
????????????get;
????????????set;
????????}
????????/// <summary>
????????/// 姓名(可讀可寫)
????????/// </summary>
????????string Name
????????{
????????????get;
????????????set;
????????}
????????/// <summary>
????????/// 顯示定義的編號和姓名
????????/// </summary>
????????void ShowInfo();
????}
????class Program:ImyInterface//繼承自接口
????{
????????string id = "";
????????string name = "";
????????/// <summary>
????????/// 編號
????????/// </summary>
????????public string ID
????????{
????????????get
????????????{
????????????????return id;
????????????}
????????????set
????????????{
????????????????id = value;
????????????}
????????}
????????/// <summary>
????????/// 姓名
????????/// </summary>
????????public string Name
????????{
????????????get
????????????{
????????????????return name;
????????????}
????????????set
????????????{
????????????????name = value;
????????????}
????????}
????????/// <summary>
????????/// 顯示定義的編號和姓名
????????/// </summary>
????????public void ShowInfo()
????????{
????????????Console.WriteLine("編號\t 姓名");
????????????Console.WriteLine(ID + "\t " + Name);
????????}
????????static void Main(string[] args)
????????{
????????????Program program = new Program();???????????????//實例化Program類對象
????????????ImyInterface imyinterface = program;???????????//使用派生類對象實例化接口ImyInterface
????????????imyinterface.ID = "TM";????????????????????????//為派生類中的ID屬性賦值
????????????imyinterface.Name = "IT江湖";??//為派生類中的Name屬性賦值
????????????imyinterface.ShowInfo();???????????????????????//調用派生類中方法顯示定義的屬性值
????????????
????????????Console.Write("按任意鍵繼續 . . . ");
????????Console.ReadKey(true);
????????}
????}
?
?
4
using System;
using System.Collections.Generic;
using System.Text;
namespace _
{
????public interface IBankAccount
????{
????????void PayIn(decimal amount);
????????bool Withdraw(decimal amount);
????
????????decimal Balance
????????{
????????????get;
????????}
????}
????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 銀行存款: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 銀行存款:Balance={0,6:C}", balance);
????????}
????}
class Program
????{
static void Main(string[] args)
{
????IBankAccount venusAccount = new SaverAccount();
????IBankAccount jupiterAccount = new GoldAccount();
????venusAccount.PayIn(200);
????jupiterAccount.PayIn(500);
????Console.WriteLine(venusAccount.ToString());
????jupiterAccount.PayIn(400);
????jupiterAccount.Withdraw(500);
????jupiterAccount.Withdraw(100);
????Console.WriteLine(jupiterAccount.ToString());
????Console.Write("按任意鍵繼續 . . . ");
????????????Console.ReadKey(true);
}
}
}
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結