一、定义接口的规则
-
接口定义既不能有构造函数,也不能有字段。
-
接口定义不允许包含运算符重载
-
接口定义不能声明关于成员的修饰符,(接口成员总是公有的)
-
接口不能声明为虚拟或静态。
-
C# 支持多接口继承和单一实现继承
public interface IDisposable
{
void Dispose();
}
class SomeClass : IDisposable
{
public void Dispose()
{
}
}
二、定义和实现接口
例子: 假定编写代码,最终允许在银行账户之间进行计算机转账业务。许多公司可以实现银行账户,但它们一致认为,表示银行账户的所有类都实现接口 IBankAccount。该接口包含一个用于存取款的方法和一个返回余额的属性。这个接口还允许外部代码识别由不同银行账户实现的各种银行账户类。我们的目的是允许银行账户彼此通信,以便在账户之间进行转账业务。
使用了接口后,不同的银行账户类不仅会编译到不同的程序集中,而且这些程序集位于不同机器上。
设计需求:
- 不同银行的银行账户,具有存取款和返回余额的功能。(接口1)
- 不同的银行账户之间进行通信,除了存取和返回余额外,还具有转账的功能。(继承于接口1的接口2)
1、实现不同银行的银行账户,存取款和返回余额的功能
1) 定义银行账户的接口
定义一个接口来进行存款和取款的功能。
//银行账户的接口
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance { get; }
}
2)实现不同银行账户的接口的类:
//编写 Venus 银行账户的类
public class SaveAccount : 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
{
return balance;
}
}
public override string ToString()
{
return String.Format("Venus Bank Saver:Balance = {0,6:C}", balance);
}
}
//编写 Jupiter 银行账户的类
public class GoldAccount : 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
{
return balance;
}
}
public override string ToString()
{
return String.Format("Jupiter Bank Saver:Balance = {0,6:C}", balance);
}
}
3)存取款的测试代码
class Program
{
static void Main(string[] args)
{
IBankAccount venusAccount = new SaveAccount();
IBankAccount jupiterAccount = new GoldAccount();
venusAccount.PayIn(200);
jupiterAccount.Withdraw(100);
Console.WriteLine(venusAccount.ToString());
jupiterAccount.PayIn(500);
jupiterAccount.Withdraw(600);
jupiterAccount.Withdraw(100);
Console.WriteLine(jupiterAccount.ToString());
Console.ReadKey();
}
}
4) 测试代码,还可以这样写法:
class Program
{
static void Main(string[] args)
{
//也可以这样写
//接口引用可以看成类引用。
//可以构造接口数组,其中数组的每个元素都是不同的类
IBankAccount[] accounts = new IBankAccount[2];
accounts[0] = new SaveAccount();
accounts[1] = new GoldAccount();
Console.ReadKey();
}
}
输出结果:
Withdrawal attempt failed.
Venus Bank Saver:Balance = ¥200.00
Withdrawal attempt failed.
Jupiter Bank Saver:Balance = ¥400.00
2、不同银行账户之间进行转账
1)定义一个转账的派生接口
继承接口来定义一个转账功能。
public interface ITransferBankAccount : IBankAccount
{
//转账到指定的账户
bool TransferTo(IBankAccount destination, decimal amount);
}
2)实现转账接口的类
定义一个当前银行账户进行转账到另一个银行账户的类
public class CurrentAccount : ITransferBankAccount
{
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
{
return balance;
}
}
转账
public bool TransferTo(IBankAccount destination,decimal amount)
{
bool result;
result = Withdraw(amount);
if(result)
{
destination.PayIn(amount);
}
return result;
}
public override string ToString()
{
return String.Format("Jupiter Bank Current Account: Balance = {0,6:C}", balance);
}
}
3)转账的测试代码
class Program
{
static void Main(string[] args)
{
IBankAccount venusAccount = new SaveAccount();
ITransferBankAccount jupiterAccount = new CurrentAccount();
venusAccount.PayIn(200);
jupiterAccount.PayIn(500);
jupiterAccount.TransferTo(venusAccount, 100);
Console.WriteLine(venusAccount.ToString());
Console.WriteLine(jupiterAccount.ToString());
Console.ReadKey();
}
}
输出结果:
Venus Bank Saver:Balance = ¥300.00
Jupiter Bank Current Account: Balance = ¥400.00