using System;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
/*
在这里我们把它们声明为IBankAccount引用的方式,而没有声明为类的引用。
这表示它们可以指向实现这个接口的任何类的实例。
但是缺点是:
只能通过这些引用调用接口中的方法,如果要调用由类执行的、不在接口中的方法(比如这里重写的ToString()方法),
就需要把引用强制转换为适合的类型。
但是这里没有任何显示的转换,因为ToString()是一个System.Object方法,C#编译器知道任何类都支持这个方法
换言之,从接口道System.Object的数据类型转换时隐式的)
*/
IBankAccount abcAcount = new SaverAccount();
abcAcount.PayIn(200);
abcAcount.Withdraw(100);
Console.WriteLine(abcAcount.ToString());
IBankAccount icbcAcount = new GoldAccount();
icbcAcount.PayIn(500);
icbcAcount.Withdraw(600);
icbcAcount.Withdraw(100);
Console.WriteLine(icbcAcount.ToString());
Console.ReadLine();
}
}
// 声明接口在语法上和声明抽象类完全相同
public interface IBankAccount
{
// 接口成员的访问级别是默认的(默认为public),所以在声明时不能再为接口成员指定任何访问修饰符,
// 否则 编译器会报错。
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}
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("Withdraw attempt failed");
return false;
}
public decimal Balance
{
get
{
return balance;
}
}
public override string ToString()
{
return String.Format(" ABC Bank Saver: Balance = {0,6:C}", balance);
}
}
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("Withdraw attempt failed");
return false;
}
public decimal Balance
{
get
{
return balance;
}
}
public override string ToString()
{
return String.Format("ICBC Bank2 Saver: Balance = {0,6:C}", balance);
}
}
}