接口和抽象超类以前都有用过,当时就有点疑惑,明明接口的这个功能有超类来替代就是可以的,何必还要有接口这个东西呢,今天看了《JAVA 与模式》中的阐述才算明白。
之所以要用接口来实现软件的可插入性,是因为如果我们选择基于类的继承来保证可插入性,应该说在最简单的情况下可以实现,但是如果当一个类要同时实现两种接口的时候,用类的继承实现方式就出现了问题,因为在C#中还是JAVA中,一个类只能继承自一个超类,而可以实现多个接口。所以要用类的继承实现方式保证可插入性就必须出现一个超超类,这样就违反了Open Close Principle。所以说这也就是什么时候采用接口继承、什么时候采用类继承的主要参考原则。
而且,在下列情况用接口来保证可插入性显得更灵活,(
关联可插入性)如一个对象要完成一个任务要知道另外一个对象并调用其方法,这个对象对其他对象的知识叫关联,而这个关联可以移到与接口,即是关心的不是具体类,而是具体类有没有实现该接口。(
调用可插入性)由调用具体类变成了通过接口调用具体类,这样在调用的时候就不必关心具体类,而是动态决定,只要实现该接口的类都可以被调用。
前段时间公司培训,有一位讲师在讲述面向对象的过程中讲到,曾经有人建议过让他们编码的时候尽量的花点时间把接口抽象出来,然后再去实现它,后来遭到他们的反对,所以也就没有执行。而现在系统做的越来越大了,由具体类之间的依赖所引发的问题也应该就越来越多了,处理起来也越来越棘手了,所以可以说
软件越复杂,规模越大,客制化越多,接口的重要性就越大。
以前学J2EE的时候觉得J2EE里面无论是EJB, 还是Servelet、Jsp,JMS怎么就那么多接口呢,看来是自己愚昧了
href="http://www.cnblogs.com/masterpiece/Services/Pingback.aspx" rel="pingback"/>
#
re: 接口与抽象超类
这个对象对其他对象的知识叫关联,而这个关联可以移到与接口,即是关心的不是具体类,而是具体类有没有实现该接口。
依赖反转的思想啊.怎么随笔只发在家里了
# re: 接口与抽象超类
呵呵!有些东西是看《JAVA与模式》的,也不是自己的原创,所以只作为读书笔记用,就没拿出来。
# re: 接口与抽象超类
类继承和接口继承只是表面的现象,其用途是不同的,接口继承则必须实现属性和方法,类继承更多关注是扩展和多态.
# re: 接口与抽象超类
接口主要是有于交互。它定义一种契约。
类主要是用于复用。
接口的确是灵活得多。
# re: 接口与抽象超类
to minbear:
谢谢minbear的回答,让我更清楚了类继承与接口继承的区别,看来OO还差的远着呢:(。
其实类继承的多态在我的前几篇随笔里有说过,在这一篇里面主要是说接口继承和类继承在保证系统可扩展性的上的不同功用。
另外:“接口继承则必须实现属性和方法,类继承更多关注是扩展和多态. ”是不是我对多态理解不对啊,接口不可以实现多态吗?
# re: 接口与抽象超类
我认为接口与抽象超类还有一个区别。通常接口更多地代表某种功能的分类,而抽象超类则表示了族的概念。(这是我的一种理解,说法可能不规范)。举个例子来说:
例如动物,我们可以为其定义一个抽象超类public abstract class Animal。但动物中有可以飞行的,有可以在水中生活的,自然也有在陆地行走的。对于这三种情况,分别有不同的方法。而之间的区别,主要体现在功能上。所以,我们应该为这三种情况定义接口,而非抽象类:public interface ICanFly{}
public interface ICanSwim{}
public interface ICanWalk{}
那么对于具体的动物类,就可以实现不同的接口了。例如老虎:
public class Tiger:Animal,ICanWalk{}
而鳄鱼呢,则需要实现两个接口:
public class Crocodile:Animal,ICanWalk,ICanSwim{}
虽然,从实现来看,也许是考虑到类只能单继承的局限,但即使没有这个局限,从面向对象的角度来看,这种功能的划分而形成的对象,也是不适于定义类对象的。
当然,接口也可以包含为定义族。从.Net的类库中就有一个很好的例子。如接口ICollection。它就代表了集合族的概念。而IEnumerable,IComarer接口,则是出于功能分类来考虑的。
# re: 接口与抽象超类
简单的说定义和使用一个[接口]的实际过程中看重的是怎么去 [实现行为] ,抽象类对应的是[泛化],应该是[定义行为], 我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护.
# re: 接口与抽象超类
“我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护. ”
赞成!!
# re: 接口与抽象超类
抽象类和具体类的关系是 is a的关系,而具体类与接口的关系是
has a ...ability
# re: 接口与抽象超类
@idior:
不对,具体类和接口的关系仍然是is a的关系,或者如thinking in Java的作者所说,是is like a的关系。
也即是说,一个接口类型的对象,是完全可以用实现该接口的具体类来替代的,这一点,接口和抽象类是相同的。
至于has a,只有聚合或合成类的关系,才属于has a的关系。
# re: 接口与抽象超类
◎wayfarer
难道说鸟is like fly?
还是鸟 has a fly ability
# re: 接口与抽象超类
我说过接口和抽象类有一种区别,是在于接口通常用来表示某种功能的分类。
但接口很多时候也会用来表示对象,这一点和抽象类相似。此时一般认为是is a关系。例如ICollection接口。Arrayh和ArrayList类型都实现该接口。此时,我们可以认为Array is a ICollection。
不过你说的has a ability关系确实很适合,尤其是当ArrayList等类型在实现ICollection的同时,又实现IList等接口的时候,也许形容为has a ability更好吧。
我回帖的时候,把你写的has a ability看作是has a了。如果has a,自然是错误的。
# re: 接口与抽象超类
hehe,其实我明白你的意思,只是想用两个词描述一下,方便大家记忆.
其实在java中 接口常常被命名为****able 由此就可以看出接口
的含义啦~~
#
re: 接口与抽象超类
这个对象对其他对象的知识叫关联,而这个关联可以移到与接口,即是关心的不是具体类,而是具体类有没有实现该接口。
依赖反转的思想啊.怎么随笔只发在家里了
# re: 接口与抽象超类
呵呵!有些东西是看《JAVA与模式》的,也不是自己的原创,所以只作为读书笔记用,就没拿出来。
# re: 接口与抽象超类
类继承和接口继承只是表面的现象,其用途是不同的,接口继承则必须实现属性和方法,类继承更多关注是扩展和多态.
# re: 接口与抽象超类
接口主要是有于交互。它定义一种契约。
类主要是用于复用。
接口的确是灵活得多。
# re: 接口与抽象超类
to minbear:
谢谢minbear的回答,让我更清楚了类继承与接口继承的区别,看来OO还差的远着呢:(。
其实类继承的多态在我的前几篇随笔里有说过,在这一篇里面主要是说接口继承和类继承在保证系统可扩展性的上的不同功用。
另外:“接口继承则必须实现属性和方法,类继承更多关注是扩展和多态. ”是不是我对多态理解不对啊,接口不可以实现多态吗?
# re: 接口与抽象超类
我认为接口与抽象超类还有一个区别。通常接口更多地代表某种功能的分类,而抽象超类则表示了族的概念。(这是我的一种理解,说法可能不规范)。举个例子来说:
例如动物,我们可以为其定义一个抽象超类public abstract class Animal。但动物中有可以飞行的,有可以在水中生活的,自然也有在陆地行走的。对于这三种情况,分别有不同的方法。而之间的区别,主要体现在功能上。所以,我们应该为这三种情况定义接口,而非抽象类:public interface ICanFly{}
public interface ICanSwim{}
public interface ICanWalk{}
那么对于具体的动物类,就可以实现不同的接口了。例如老虎:
public class Tiger:Animal,ICanWalk{}
而鳄鱼呢,则需要实现两个接口:
public class Crocodile:Animal,ICanWalk,ICanSwim{}
虽然,从实现来看,也许是考虑到类只能单继承的局限,但即使没有这个局限,从面向对象的角度来看,这种功能的划分而形成的对象,也是不适于定义类对象的。
当然,接口也可以包含为定义族。从.Net的类库中就有一个很好的例子。如接口ICollection。它就代表了集合族的概念。而IEnumerable,IComarer接口,则是出于功能分类来考虑的。
# re: 接口与抽象超类
简单的说定义和使用一个[接口]的实际过程中看重的是怎么去 [实现行为] ,抽象类对应的是[泛化],应该是[定义行为], 我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护.
# re: 接口与抽象超类
“我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护. ”
赞成!!
# re: 接口与抽象超类
抽象类和具体类的关系是 is a的关系,而具体类与接口的关系是
has a ...ability
# re: 接口与抽象超类
@idior:
不对,具体类和接口的关系仍然是is a的关系,或者如thinking in Java的作者所说,是is like a的关系。
也即是说,一个接口类型的对象,是完全可以用实现该接口的具体类来替代的,这一点,接口和抽象类是相同的。
至于has a,只有聚合或合成类的关系,才属于has a的关系。
# re: 接口与抽象超类
◎wayfarer
难道说鸟is like fly?
还是鸟 has a fly ability
# re: 接口与抽象超类
我说过接口和抽象类有一种区别,是在于接口通常用来表示某种功能的分类。
但接口很多时候也会用来表示对象,这一点和抽象类相似。此时一般认为是is a关系。例如ICollection接口。Arrayh和ArrayList类型都实现该接口。此时,我们可以认为Array is a ICollection。
不过你说的has a ability关系确实很适合,尤其是当ArrayList等类型在实现ICollection的同时,又实现IList等接口的时候,也许形容为has a ability更好吧。
我回帖的时候,把你写的has a ability看作是has a了。如果has a,自然是错误的。
# re: 接口与抽象超类
hehe,其实我明白你的意思,只是想用两个词描述一下,方便大家记忆.
其实在java中 接口常常被命名为****able 由此就可以看出接口
的含义啦~~
评论
依赖反转的思想啊.怎么随笔只发在家里了
# re: 接口与抽象超类
呵呵!有些东西是看《JAVA与模式》的,也不是自己的原创,所以只作为读书笔记用,就没拿出来。# re: 接口与抽象超类
类继承和接口继承只是表面的现象,其用途是不同的,接口继承则必须实现属性和方法,类继承更多关注是扩展和多态.# re: 接口与抽象超类
接口主要是有于交互。它定义一种契约。类主要是用于复用。
接口的确是灵活得多。
# re: 接口与抽象超类
谢谢minbear的回答,让我更清楚了类继承与接口继承的区别,看来OO还差的远着呢:(。
其实类继承的多态在我的前几篇随笔里有说过,在这一篇里面主要是说接口继承和类继承在保证系统可扩展性的上的不同功用。
另外:“接口继承则必须实现属性和方法,类继承更多关注是扩展和多态. ”是不是我对多态理解不对啊,接口不可以实现多态吗?
# re: 接口与抽象超类
我认为接口与抽象超类还有一个区别。通常接口更多地代表某种功能的分类,而抽象超类则表示了族的概念。(这是我的一种理解,说法可能不规范)。举个例子来说:例如动物,我们可以为其定义一个抽象超类public abstract class Animal。但动物中有可以飞行的,有可以在水中生活的,自然也有在陆地行走的。对于这三种情况,分别有不同的方法。而之间的区别,主要体现在功能上。所以,我们应该为这三种情况定义接口,而非抽象类:public interface ICanFly{}
public interface ICanSwim{}
public interface ICanWalk{}
那么对于具体的动物类,就可以实现不同的接口了。例如老虎:
public class Tiger:Animal,ICanWalk{}
而鳄鱼呢,则需要实现两个接口:
public class Crocodile:Animal,ICanWalk,ICanSwim{}
虽然,从实现来看,也许是考虑到类只能单继承的局限,但即使没有这个局限,从面向对象的角度来看,这种功能的划分而形成的对象,也是不适于定义类对象的。
当然,接口也可以包含为定义族。从.Net的类库中就有一个很好的例子。如接口ICollection。它就代表了集合族的概念。而IEnumerable,IComarer接口,则是出于功能分类来考虑的。
# re: 接口与抽象超类
简单的说定义和使用一个[接口]的实际过程中看重的是怎么去 [实现行为] ,抽象类对应的是[泛化],应该是[定义行为], 我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护.# re: 接口与抽象超类
“我以为使用接口的主要目的不是为了去使用多重继承,而是消除去因为使用抽象类而形成的错综复杂的继承体系. 通过接口定义行为能够更有效地分离行为与实现,使代码更加易于维护. ”赞成!!
# re: 接口与抽象超类
抽象类和具体类的关系是 is a的关系,而具体类与接口的关系是has a ...ability
# re: 接口与抽象超类
@idior:不对,具体类和接口的关系仍然是is a的关系,或者如thinking in Java的作者所说,是is like a的关系。
也即是说,一个接口类型的对象,是完全可以用实现该接口的具体类来替代的,这一点,接口和抽象类是相同的。
至于has a,只有聚合或合成类的关系,才属于has a的关系。
# re: 接口与抽象超类
◎wayfarer难道说鸟is like fly?
还是鸟 has a fly ability
# re: 接口与抽象超类
我说过接口和抽象类有一种区别,是在于接口通常用来表示某种功能的分类。但接口很多时候也会用来表示对象,这一点和抽象类相似。此时一般认为是is a关系。例如ICollection接口。Arrayh和ArrayList类型都实现该接口。此时,我们可以认为Array is a ICollection。
不过你说的has a ability关系确实很适合,尤其是当ArrayList等类型在实现ICollection的同时,又实现IList等接口的时候,也许形容为has a ability更好吧。
我回帖的时候,把你写的has a ability看作是has a了。如果has a,自然是错误的。
# re: 接口与抽象超类
hehe,其实我明白你的意思,只是想用两个词描述一下,方便大家记忆.其实在java中 接口常常被命名为****able 由此就可以看出接口
的含义啦~~