定义和实现接口

原创 2012年03月23日 16:49:16

前面说过了接口,但都是一些概念的东西,没有些实际应用,下面就学习下接口的使用吧。

下面开发一个遵循接口继承规范的小例子来说明如何定义和使用接口。这个例子建立在银行账户的基础上。假定编写代码,最终允许在银行账户之间进行计算机转账业务。许多公司可以实现银行账户,但它们都是彼此赞同表示银行账户的所有类都实现接口IBankAccount。该接口包含一个用于存取款的方法和一个返回余额的属性。这个接口还允许外部代码识别由不同银行账户执行的各种银行账户类。我们的目的是允许银行账户彼此通信,以便在账户之间进行转账业务,但还没有介绍这个功能。

首先,需要定义IBank接口:

 

 public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}

接口的名称为IBankAccount。接口名称传统上以字母I开头,以便知道这是一个接口。

现在可以编写表示银行账户的类了

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
{
return balance;
}
}
public override string ToString()
{
return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance);
}
}

这个类的实现代码的作用一目了然。其中包含一个私有字段balance,当存款或取款时就调整这个字段。如果因为账户中的金额不足而取款失败,就会显示一个错误消息。

SaverAccount派生于一个接口IbankAccount,我们没有明确指出任何其他基类(当然这表示SaverAccount直接派生于System.Object)。另外,从接口中派生完全独立于从类中派生

SaverAccount派生于IBankAccount,表示它获得了IBankAccount的所有成员,但接口并不实际实现其方法,所以SaverAccount必须提供这些方法的所有实现代码。如果没有提供实现代码,编译器就会产生错误。接口仅表示其成员的存在性,类负责确定这些成员是虚拟还是抽象的(但只有在类本身是抽象的,这些成员才能是抽象的)。在本例中,接口方法不必是虚拟的。

 IBankAccount test = new SaverAccount();

            test.PayIn(700);
            test.Withdraw(600);

  Console.WriteLine(test.ToString());

在这段代码中,一个要点是把引用变量声明为IBankAccount引用的方式。这表示它们可以指向实现这个接口的任何类的实例。但我们只能通过这些引用调用接口的方法-- 如果要调用由类执行的、不在接口中的方法,就需要把引用强制转换为合适的类型。


IBankAccount[] accounts = new IBankAccount[2];
accounts[0] = new SaverAccount();
accounts[1] = new GoldAccount();

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android中使用回调接口实现自定义view的点击事件

安卓中,最常见的回调接口就是view的点击监听事件方法,当然,回调接口不止再此使用,他还有更广泛的使用场景。 今天,我就通过一个简单的实现点击事件Demo,了解一下回调接口的简单应用。 首先自定义一个...

struts2的拦截器(3):通过实现Interceptor接口定义自己的拦截器

虽然struts2框架提供了许多内建拦截器,这些内建拦截器实现了struts2的大部分功能,因此,大部分Web应用的通用功能,都可以通过直接使用这些拦截器来完成。但还有一些系统逻辑相关的通用功能,可以...

通过实现接口ListCellRenderer自定义JList的显示模式

我由.net转过来的,在.net中的控件ListView显示方式有三种,可以很简单的显示图标的文字,使用起来很方便,效果也不错。 转到java后,JAVA里的JList和.net里的ListView有...
  • do168
  • do168
  • 2016-06-25 21:29
  • 2394

[C#]简单重写IComparer接口,实现自己的String.CompareTo 方法,自定义比较规则。

在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异。 比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢? 重新实现ICompar...

接口中定义的方法在抽象类中实现

今天在做一个dao工厂时遇到一个问题,就是对于数据库的连接到底在哪里关闭,在创建连接时是在dao父类中创建的,而关闭则不能在一个dao的方法中去完成,那样在使用这个dao实例的方法会报异常,看来还得为...

使用Java中Comparator接口实现自定义排序

一般情况下,自己动手写一个简单排序程序还是没有问题的,但是你能保证写出来的排序程序的时间复杂度吗?你能保证程序的正确性吗,鲁棒性呢,还有程序结构的清晰性,可维护性.......综上所述,学习一下排序接...

android自定义接口,然后在activity中实现点击监听,调用getView解决滑动错位的问题

android自定义接口,然后在activity中实现点击监听刷新,调用getView利用ArrayMap记录状态,解决滑动错位的问题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)