yeafee@夜飞郎

it's usually better to solve problems with simplicity and finesse rather than muscle.

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  33 随笔 :: 3 文章 :: 2 评论 :: 0 Trackbacks
Java语言中对于抽象类定义进行支持两种机制:abstract class 扩展extends和 interface 实现implements。

abstract class和interface在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换(程序不会出错,功能也可以同等实现)。

因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意(和弄不清两种抽象机制有关?)。

其实,abstract class 和 interface 区别开来还是容易的。只要弄清楚描述对象本质和抽象概念的关系就好区分了。
当描述对象本质和抽象概念是"is-a"关系时使用abstract来抽象描述对象;当描述对象本质和抽象概念是"like-a"关系时使用interface来抽象该对象
 
举个例子:
我们来抽象手机,作为一种通讯工具。它的基本功能是拔电话(本质),不具备此功能的还能称为手机?然后大家知道,手机还有许多的扩展功能,各家可能都不一样。

1abstract class Call
2// 
3abstract void dial(); 
4}
 

interface Dict
    
void findWord(); 
}
 

class XXPaiTelephone 
extends Call 
implements Dict
    
void dial(){  } 
    
void findWord(){  } 
}


上面基本实现对某品牌电话的一个抽象描述。因为描述对象本质是电话("is-a"关系),所以在抽象电话的功能时用的是abstract,而在抽象词典功能("like-a"关系,带词典功能手机,像一部词典)时就的就是interface。

如果换了描述对象,假如电话换成是学习机。此时,查词典成了本质("is-a"关系)。打电话的功能就成了一种扩展功能("like-a"的关系,像一个电话,其实它主要是用来查词典的)

abstract class Dict
    
abstract void findWord();
}

 
interface Call
    
void dial(); 
}
 


class XXPLearnMachine 
extends Dict 
implements Call
    
void findWord(){  } 
    
void dial(){  } 
}

参考:http://www.cnblogs.com/Mozier/archive/2006/04/08/369851.html
posted on 2010-02-09 16:07 @yeafee 阅读(191) 评论(0)  编辑  收藏 所属分类: 程序语言

只有注册用户登录后才能发表评论。


网站导航: