日期:2014-05-18  浏览次数:21169 次

抽象类实现接口的意义是什么?
我看到。net类库有些抽象类实现接口我十分的不解,我觉得用抽象类的实例方法是一个样的,谁来解惑,最好举实例

------解决方案--------------------
用接口的同时,又用抽象类,这是很常见的一种设计方式

这样可以在提供一定重用代码的基础上,也为user扩展提供了切入点。

举个例子,ASP.Net里的IHttpHandler接口和Page类。

Page是abstract class,其实现了接口IHttpHandler。在Page基类里微软实现了一个页面生命周期的模板,这样一般的用户你可以直接从Page基类里继承,只要去Override一些局部的点就可以了,比如OnLoad方法,不用每个用户自己再去写一遍整个页面生命周期的代码。这里做到了代码的重用,也就是模板流程的重用。其实就是GOF里的模板方法模式典型例子。

在从Page基类派生,也可以通过在子类Override来达到扩展,但是这个扩展会被限制在Page的页面生命周期模型的范围内。
假设,有些用户可能此时会有特殊要求,微软实现的页面生命周期无法达到用户的要求,那么此时,你可以从IHttpHandler接口来继承实现你自己的功能,这样你可以完全抛弃掉Page基类里的那套页面生命周期模型,实现你自己的特殊需求。

而对于APS.Net的Runtime框架,它看到的永远都只是IHttpHandler接口的引用,而不关心引用所指向的具体对象是从Page继承的子类还是你自己写的非Page的子类。这可以看成是GOF的策略模式的典型例子。

所以大部分的框架设计都会看到 策略模式 + 模板方法模式的结合运用,也就是在使用接口的同时,又使用抽象类,在抽象基类里就是你为user提供的一个(建议的)默认的接口实现的半成品,用户可以选择在你的半成品基础上做少量扩展形成成品,也可以完全从接口实现自己的成品而不通过你的半成品。
------解决方案--------------------
这个你都不知道么,
你知道为什么要设计接口,
然后还要用抽象类么?
因为他们需要偷懒!
------解决方案--------------------
抽象类不能当接口用啊,因为C#中舍弃了多重继承
就像楼主在11楼说的,你的b类如果需要有其他父类呢,如b你需要从Control继承下来,但是也要有ia的方法,此时你就只能实现ia的接口。但是有时候b类并不需要父类,但是它只想实现ia的chl方法(假设ia有100个方法),此时就只需要继承a类并重写chl方法。你可能说a类不还是得实现100个方法么?确实是这样,但是有可能a类的子类有很多呢?除了b,还有c、d、e等等,难道你就为了实现一部分方法,把接口方法全部实现一遍?何况接口有可能是分层实现,例如b继承a,实现ia的部分方法,然后c继承b再实现ia的部分方法。。。