接口
一般情况下,接口只能包含方法、属性、索引器和事件的声明。
不能实例化接口。接口不能有构造函数,也不能有字段。接口定义不允许包含运算符重载,因为接口是公共协定,包含运算符重载会引起与其他.net语言不兼容的情况。
接口成员总是公有的,不能声明为虚拟或静态。
public interface IDisposable { void Dispose(); }
接口的定义和实现
首先,定义IBankAccount接口
namespace Wrox.ProCSharp { public interface IBankAccount { void PayIn(decimal amount); Bool Withdraw (decimal amount); Decimal Balance {get;} } }
然后编写表示银行账户的类,这些类可以完全不同,但它们都表示银行账户,因为它们都实现IBankAccount接口,比如
namespace Wrox.ProCSharp.VenusBank { public class SaverAccount:IBankAccount { private decimal balance; public void PayIn(decimal amount) { balance +=amount;} public bool Withdraw ( decimal amount ) { if(balance>=amount) { balance -=amount; return true;} console.WriteLine(“Withdrawal attempt failed.”); return false; } public decimal Balance { get;} public override string ToString() { return String.Format(“Venus Bank Saver: Balance={0,6:C}”,balance);} } }
私有字段Balance,当存款或取款时就调整这个字段。
SaverAccount派生自IBankAccount,表示它获得了IBankAccount的所有成员,但接口实际上并不实现其方法,所以SaverAccount必须提供这些方法的所有实现代码。接口仅表示其成员的存在性,类负责确定这些成员是虚拟的还是抽象的。
测试接口类
Using System Using Wrox.ProCSharp Using Wrox.ProCSharp.VenusBank static void Main() { IBankAccount venusAccount=new SaverAccount(); // }
要点是把引用变量声明为IBankAccount引用的方法,这表示它们可以指向实现这个接口的任何类的任何实例。
派生的接口
public interface ITransferBankAccount: IBankAccount { bool TransferTo (IBankAccount destination, decimal amount); }
派生自派生接口的类都必须实现IBankAccount的所有方法和TransferBankAccount中定义的新方法。