[和管子对话] 2 2007-4-6/抽象类和接口的谁是谁非

 

发布日期:2007.4.6 作者:Anytao

©2007 Anytao.com 转贴请注明出处,留此信息。

 

本文将介绍以下内容:

• .NET的基础和技巧探讨

• 胡言乱语话技术

 

王论:

今日话题:《抽象类和接口的异同》

管语:

呵呵!好!

先说一下抽象类:
抽象类是声明方法的存在而不去实现它,这样的类就是抽象类,它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现方法,这和接口一致。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。就是说知道其行为的子类或其他类可以在类中实现这些方法。
在java中,抽象类中可以没有抽象方法
如果一个类中有抽象方法,那么这个类必须定义为抽象类

王论:

我来说接口:
接口在某种程度上和抽象类是一样的,例如都是提供了声明而没有实现,必须由集成的类实现所有定义的接口方法,否则不能编译。
上述你所说的关于Java中抽象类的规则,基本和.NET差不多。

管语:

java中:
接口是抽象类的变体。在接口中,所有方法隐含着都是抽象的。多继承性可通过实现这样的接口而获得。因为接口中的所有方法都是抽象的,所以没有一个有程序体。接口可以定义static final成员变量,我认为这是一个抽象类不同的地方,接口的实现与子类相似,但是这个实现类不能从接口定义中继承行为。这也是和普通类继承机制不同的地方。当类实现特殊接口时,它定义必须所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。instanceof 运算符可以用来决定某对象的类是否实现了接口。

抽象类中,究竟可不可以实现一个方法?我刚才是不是说错了?

王论:

刚才讲了相同点,现在说说不同处:
抽象类:可以包括抽象方法,也可以提供非抽象方法,也就是说,抽象类中可以有实现的方法,这些方法可以提供公共的规则定义。
接口:只能提供没有实现的抽象方法,在接口中,所有的方法都默认为public,因此,接口中不能有private修饰符。
抽象类:只能单继承;
接口:可以多继承。

管语:

其实就是应该多说说他们的不同点

王论:

是啊,另外你刚才说的instanceof操作符号,是用来判断接口类型,还是其他类型都可以判断:
在C#中有一个is操作符是可以判断所有类型的。例如:

 1interface IAnytao
 2{} 
 3
 4class Test
 5{
 6IAnytao tao = new Anytao();
 7if (tao is IAnytao) 
 8{
 9Console.Write("tao is a instance of IAnytao.");
10}

11}

12

 

管语:

intanceof和is是一个意思!

王论:

另外,C#中还有as操作符,Java中有对应的吗?

管语:

as是干吗的?

王论:

和is差不多,不过更常用,效率更高

管语:

区别:

1、接口可以被多重implements,抽象类只能被单一extends

2、接口只有定义,抽象类可以有定义和实现

3、接口的字段定义默认为:public static final,抽象类字段默认是友元的,就是“friend”(本包可见)

4、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为的规范。

5、接口基本不具备继承的任何基本特点,它只是承诺了能够调用的方法。

6、一个类一次可以实现多个接口,但是只能继承一个父类。

7、接口可以用于支持回调(callback),但是继承不行。用于回调的接口只是提供指向方法的指针,而且是一个类型安全的“指针方式”。

 

 

©2007 Anytao.com 转贴请注明出处,留此信息。

本贴子以现状提供且没有任何担保,同时也没有授予任何权利。
This posting is provided "AS IS" with no warranties, and confers no rights.

posted @ 2007-04-06 18:21 Anytao 阅读(2161) 评论(62)  编辑 收藏 所属分类: 16 [杂家杂谈]

  回复  引用    
#1楼 2007-04-07 19:27 | Agogo.Net [未注册用户]
意义不是太大哦.......有堆写的挺乱的..........
这部分讨论已经很多了
以后讨论完可以给具体的实现
  回复  引用    
#2楼 2007-04-07 19:28 | Agogo.Net [未注册用户]
再给出几个讨论该话题的经典链接,这样会更好
  回复  引用    
#3楼 2007-04-07 20:56 | jujusharp [未注册用户]
蛮不错的,可以继续坚持讲下去的
  回复  引用  查看    
#4楼 2007-04-08 12:38 | Artech      
总体来说:基于Interface的继承(实现)体现的是一种Can Do的关系,而基于Class的继承体现的则是一种Is A的关系。

Interface和Adstract成就了很多的设计模式,不过在绝大多数情况下,Interfce能够实现的功能,Abstract Class都能实现。同时Abstract Class具有一些Interface不具备的优势:

1.由于Abstract Class可以包含某些方法的实现,所以可以把一些公用的功能为继承自他的Sub Class共享。
2.由于Abstract Class中可以定义非Abstract 的方法,所以在Abstract Class中加上其他的方法不会导致Sub Class的修改。

所以,所代码共用和可扩展性考虑,尽量使用Abstract Class.当然这只是一个指导方针,不能一概而论。
  回复  引用  查看    
#5楼 [楼主]2007-04-08 20:41 | Anytao      
@jujusharp
谢谢支持
  回复  引用  查看    
#6楼 2007-05-28 10:31 | Anders06      
>>>抽象类是声明方法的存在而不去实现它

抽象类里不能有非抽象方法?? lz讲的是java??


感觉只是在语言概念上堆砌,没讲到实质点了.
  回复  引用    
#7楼 2007-07-24 12:22 | 古巴 [未注册用户]
第7条不懂,请问详细解释一下么,或给个有详细说明的地址也行
  回复  引用  查看    
#8楼 [楼主]2007-07-24 12:38 | Anytao      
@Ah Yuan
:-)
  回复  引用  查看    
#9楼 [楼主]2007-07-24 12:38 | Anytao      
@Sean(陈阳)
@念时
@sohbet
@laudy
:-)
  回复  引用  查看    
#10楼 [楼主]2007-07-24 12:41 | Anytao      
@古巴
http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html
评论部分,我给了一个示例,希望对你有帮助
  回复  引用    
#11楼 2007-09-15 15:52 | qq2 [未注册用户]
实在是,以其混混使人昭昭
类对接口只能说是“实现”,不能说是“继承”
所谓接口对于接口的“多继承”,也是不合适的,最多叫做接口的“组合”
而继承的本质是对基类的“实现”部分的延续。
关于多继承不要再讨论了,没劲透了
  回复  引用  查看    
#12楼 [楼主]2007-09-15 16:11 | Anytao      
@qq2
:-),关于用词,以后注意,的确不当。
关于多继承好像本文并未做过多讨论。
  回复  引用  查看    
#13楼 [楼主]2008-02-02 09:18 | Anytao      
@sohbet odaları
No adver here.
  回复  引用    
#14楼 2008-02-12 03:42 | Chat [未注册用户]
Thanx Shadow
  回复  引用    
#15楼 2008-02-12 03:43 | Chat [未注册用户]
thnx shadow
  回复  引用  查看    
#16楼 [楼主]2008-02-13 23:10 | Anytao      
@Chat
:-)
  回复  引用    
#17楼 2008-03-13 10:32 | WONG SEOUL [未注册用户]
Great sharing thanks......
  回复  引用  查看    
#18楼 [楼主]2008-03-13 10:50 | Anytao      
@WONG SEOUL
You are welcome.
More talks about interface and abstract class follows as:
http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html

  回复  引用    
#19楼 2008-03-20 07:58 | Wong SEOUL [未注册用户]
是啊,另外你刚才说的instanceof操作符号,是用来判断接口类型,还是其他类型都可以判断:
在C#中有一个is操作符是可以判断所有类型的。例如:
  回复  引用  查看    
#20楼 [楼主]2008-03-20 09:33 | Anytao      
@ruya tabirleri
?
  回复  引用  查看    
#21楼 [楼主]2008-03-20 09:39 | Anytao      
@Wong SEOUL
Java我涉猎不深,关于instanceof不能给你答案;-)
关于is操作符,我在《你必须知道的.NET》7.5节“恩怨情仇:is和as”中有所讨论。
  回复  引用    
#22楼 2008-03-21 04:33 | sohbet [未注册用户]
thank you sohbetiy.com
  回复  引用    
#23楼 2008-03-22 07:23 | porno [未注册用户]
感觉只是在语言概念上堆砌,没讲到实质点了
  回复  引用    
#24楼 2008-03-22 23:12 | Miami [未注册用户]
Anytao,

Why do not you delete some of these spams.. ?
  回复  引用    
#25楼 2008-03-23 02:44 | Miami [未注册用户]
只能提供没有实现的抽象方法,在接口中,所有的方法都默认为public,因此,接口中不能有private修饰符。
抽象类:只能单继承; ??
  回复  引用  查看    
#26楼 [楼主]2008-03-23 17:49 | Anytao      
@Miami
The advertisement alway comes here. I didn't pay more attention to these spams.
Sorry, I'll delete it at once.
  回复  引用  查看    
#27楼 [楼主]2008-03-23 17:53 | Anytao      
@Miami
详细参加http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html,或者《你必须知道的.NET》7.4节“面向抽象编程:接口和抽象类 ”的论述
  回复  引用  查看    
#28楼 [楼主]2008-03-23 17:54 | Anytao      
@porno
详细参见http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html,或者《你必须知道的.NET》7.4节“面向抽象编程:接口和抽象类 ”的论述

  回复  引用    
#29楼 2008-03-25 20:54 | kyt.miami [未注册用户]
nice blog
  回复  引用  查看    
#30楼 [楼主]2008-03-26 08:56 | Anytao      
@kyt.miami
:-)
  回复  引用    
#31楼 2008-04-10 07:21 | WONG SEO-UL [未注册用户]
接口可以定义static final成员变量,我认为这是一个抽象类不同的地方,接口的实现与子类相似,但是这个实现类不能从接口定义中继承行为。
http://bloguni.com
  回复  引用    
#32楼 2008-04-10 11:14 | Chandeliers [未注册用户]
1.由于Abstract Class可以包含某些方法的实现,所以可以把一些公用的功能为继承自他的Sub Class共享。?
  回复  引用  查看    
#33楼 [楼主]2008-04-10 20:07 | Anytao      
@WONG SEO-UL
@Chandeliers
:-)
  回复  引用    
#34楼 2008-04-14 03:34 | Miami [未注册用户]
Hey Anytao,

What are those? ..like the following one... are those deleted postings?...
@WONG SEO-UL
@Chandeliers
:-)
  回复  引用    
#35楼 2008-04-17 21:41 | miami [未注册用户]
于接口的“多继承”,也是不合适的,最多叫做接口的“组合”
而继承的本质是对基类的“实现”
  回复  引用  查看    
#36楼 [楼主]2008-04-20 12:18 | Anytao      
@Miami
I didn't delete any normal discuss except advertisement here.

About Abstract class and Interface in Java, I'm not clear about that, so I can't give any review to response.

@Chandeliers

I think the decsription of Artech is totally right? Is any error happened here?

  回复  引用  查看    
#37楼 [楼主]2008-04-20 12:20 | Anytao      
@miami
表达上按照一般惯例,借用了“继承”这个概念,至少在微软的表述里:实现单继承、接口多继承的说法还是有的,所以你的意见很正确,但是此处着眼于表述不同,忽略了概念的准确性:-)
  回复  引用    
#39楼 2008-05-02 01:37 | sohbet [未注册用户]
sohbet
  回复  引用    
#40楼 2008-05-25 23:12 | eğlence [未注册用户]
thanks
  回复  引用    
#41楼 2008-06-09 16:57 | 中古ビデオ [未注册用户]
thanks...
  回复  引用    
#42楼 2008-06-18 10:39 | Hoodia [未注册用户]
王论:

和is差不多,不过更常用,效率更高
  回复  引用  查看    
#43楼 [楼主]2008-06-18 22:16 | Anytao      
@Hoodia
So what, it's a long time paper
  回复  引用  查看    
#44楼 2008-07-09 17:34 | AlexLiu      
文风确实幽默!
  回复  引用  查看    
#45楼 [楼主]2008-07-10 22:36 | Anytao      
@AlexLiu
呵呵,希望常来看看
  回复  引用    
#46楼 2008-09-09 19:59 | flysun0311 [未注册用户]
第一次来这里,感觉不错,我会经常关注LZ的,
支持你!
谢谢
  回复  引用  查看    
#47楼 [楼主]2008-09-09 22:06 | Anytao      
@flysun0311
随时欢迎:-)
  回复  引用  查看    
#48楼 2008-09-21 11:44 | YITIAN Studio      
@qq2
--引用--------------------------------------------------
qq2: 实在是,以其混混使人昭昭
<br>类对接口只能说是“实现”,不能说是“继承”
<br>所谓接口对于接口的“多继承”,也是不合适的,最多叫做接口的“组合”
<br>而继承的本质是对基类的“实现”部分的延续。
<br>关于多继承不要再讨论了,没劲透了
--------------------------------------------------------
接口为什么不能说是继承?c#里为什么都只用冒号就表示了对接口的实现和对基类的继承?其实java里分的到清楚,可是用起来时除了意义上去区分实现和继承以外感觉没有别的更好的地方能区分开。所以楼主说继承还是实现,我觉得没什么。
其实qq2除了挑几个自以为是的字眼以外也没说出来什么东西。。。楼主说了很多却。呵呵
  回复  引用  查看    
#49楼 [楼主]2008-09-21 21:43 | Anytao      
@YITIAN Studio
:-)

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-09-22 13:33 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索

相关链接: