我对implement与abstract的理解

个人理解,不足之处请指正。

接口很抽象类有很对相似之处,甚至基本上抽象类都可以被接口替代,但是两者还是有区别的,用处不一致。

接口,是为了实现代码的封装,实现其透明。

抽象类:终究是一个类,是对某个或者某些类得抽象,本身是可以实现代码的封装,但是此类的根本目的并不是为了实现数据的透明,要不要接口干嘛呢,我的理解是为了抽象,抽出公用的方法或者变量,共集成的类直接使用。

如:我们有一个Bank(银行)类。Bank有两个方法,deposit(存钱)和withdraw(取钱)。

类和方法的定义如下:

 

														
Code 2.1 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 增加account账户的钱数,返回账户里当前的钱数
}

public float withdraw(AccountInfo account, float money){
  // 减少account账户的钱数,返回取出的钱数
}
};

												

这两个方法涉及到用户的账户资金等重要信息,必须要非常小心,所以编写完上面的商业逻辑之后,项目负责人又提出了新的要求--给Bank类的每个重要方法加上安全认证特性。

于是,我们不得不分别在上面的两个方法中加入安全认证的代码。

类和方法的定义如下:(新增加的代码用不同的背景标出)

 

														
Code 2.2 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 验证account是否为合法用户
  // 增加account账户的钱数,返回账户里当前的钱数
}

public float withdraw(AccountInfo account, float money){
  // 验证account是否为合法用户
  // 减少account账户的钱数,返回取出的钱数
}
};

												

这两个方法都需要操作数据库,为了保持数据完整性,项目负责人又提出了新的要求--给Bank类的每个操作数据库的方法加上事务控制。

于是,我们不得不分别在上面的两个方法中加入安全认证的代码。

类和方法的定义如下:(新增加的代码用不同的背景标出)

 

														
Code 2.3 Bank.java
class Bank{
public float deposit(AccountInfo account, float money){
  // 验证account是否为合法用户
  // Begin Transaction
  // 增加account账户的钱数,返回账户里当前的钱数
  // End Transaction
}

public float withdraw(AccountInfo account, float money){
  // 验证account是否为合法用户
  // Begin Transaction
  // 减少account账户的钱数,返回取出的钱数
  // End Transaction
}
};

												

我们看到,这些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止两个。如何解决这种问题?

如何实现,如果bank里面充斥着大量的类似方法,我可能写一个普通工厂类,进行跳转,但是这并不能解决代码的复杂性,甚至让其更加复杂。接口在此处就显得力不从心了。我改下方法。

														
Code 2.4 Base.java
abstract class Base{
public float importantMethod(AccountInfo account, float money){
  // 验证account是否为合法用户
  // Begin Transaction
  
  float result = yourBusiness(account, money)

  // End Transaction
  return result;	
}

protected abstract float yourBusiness(AccountInfo account, float money);
};

Code 2.5 BankDeposit.java
class BankDeposit extends Base{ 
protected float yourBusiness(AccountInfo account, float money){
  // 增加account账户的钱数,返回账户里当前的钱数
}
};

Code 2.6 BankWithdraw.java
class BankWithdraw extends Base{ 
protected float yourBusiness(AccountInfo account, float money){
  // 减少account账户的钱数,返回取出的钱数
}
};

												

综上所述:

抽象类具有类的特性,单继承,子类重新需要重写的方法。

接口:一个类或者接口可以继承多个接口,继承接口的类必须有其所有的抽象方法的实现,不管你用不用。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值