下面开发一个遵循接口继承的小例子来说明如何定义和使用。
假设这个例子建立在银行账户的基础上。 假定编写代码,表示银行账户的所有类都实现接口 IBankAccount. 该接口包含一个用于存取款的方法和一个返回余额的属性。
// 通常接口名称以字母I开头
public interface IBankAccount
{
void PayIn (decimal amount);
bool Withdraw (decimal amount);
decimal Balance {get;}
}
现在可以编写银行账户的类了。 这些类不必彼此相关,他们可以是完全不同的类。 但它们都表示银行账户,因为它们都实现了IBankAccount 接口。
public class SaverAccount : IBankAccount
{
private decimal _balance;
public decimal Balance => _balance;
public void PlayIn(decimal amount)
{
_balance += amount;
}
public bool Withdraw(decimal amount)
{
if (_balance >= amount)
{
_balance -= amount;
return true;
}
Debug.Log("Withdrawal attempt failed.");
return false;
}
public override string ToString()
{
return $"Venus Bank Saver: Balance = {_balance, 6:C}";
}
}
实现这个类的作用一目了然。 其中包含一个私有字段 balance, 当存款或取款时就调整这个字段。 如果因为账户中的金额不足而取款失败, 就会显示一条错误信息。 还要注意, 因为我们要使代码尽可能简单,所以不实现额外的属性, 如账户持有人的姓名。 在现实生活中,这是最基本的信息, 但对于本例不必要那么复杂。
测试代码:
static void Main()
{
// 把引用变量声明为 IBankAccount, 它可以指向实现这个接口的SaverAccount类的实例。
IBankAccount venusAccount = new SaverAccount();
venusAccount.PlayIn(200);
venusAccount.Withdraw(100);
Debug.Log(venusAccount.ToString());
}
注意:如果要调用由类实现的但不在接口中的方法, 就需要把引用强制转换为合适的类型。这段代码中,我们调用了ToString ,它不是 IBankAccount 实现的, 但也没有进行显示的强制转换, 这是因为 ToString 是一个 System.Object 的方法,因此编译器知道任何类都支持这个方法(从任何接口到System.Object的数据类型强制转换是隐式的)。