首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

哪位高手能详细说明一下用接口或抽像类有哪些好处或方便的吗

2012-01-18 
谁能详细说明一下用接口或抽像类有哪些好处或方便的吗?谁能详细说明一下用接口或抽像类有哪些好处或方便的

谁能详细说明一下用接口或抽像类有哪些好处或方便的吗?
谁能详细说明一下用接口或抽像类有哪些好处或方便的吗?

详细的马上给分!!!

[解决办法]
曾经有人这样描述它们 :
接口是给外人用的 , 抽象类是给子孙用的
[解决办法]
举个比较简单的例子,也是我刚做过的,呵呵

如果你想让你的数据库底层代码同时支持SQL和ACCESS数据库,那么使用抽象类来实现就非常方便

先写一个抽象类(DBConn),当然在这里面声明的一些方法,如Connection,必须要使用其接口形式也声明,因为这样才能通用,如下

public abstract IDbConnection Connection { get;}

用接口声明是为了以下继承时可以通用

然后再分别做2个类继承于此类: SqlDBConn OleDBConn

在2个子类里就可以具体实现抽象类的数据读取方法了

然后在前台调用时就可以体现其好处了:

这时只需用抽象类去声明对象,然后再用不同的数据库类去实例化它

DBConn dbop= new SqlDBConn();
或者
DBConn dbop= new OleDBConn();

这样用同一个对象就可以同时操作不同的数据库了,当然你可以做得更灵活些,这样下次要修改最多也只是改一下上面的new 方法,达到通用的效果了

以上只是我大概的思路说明,如有说得不好请见谅,呵呵

[解决办法]
接口定义行为的规范

基类实现逻辑的抽象
[解决办法]
继承抽象类说明它们是同一种类的事物的细分,实现接口说明它具有某种能力。

[解决办法]
.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。



接下来先说说抽象类和接口的区别。

区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。



区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。

例如:

public abstract class AbsTest

{

public virtual void Test()

{

Debug.WriteLine( "Test " );

}

public abstract void NewTest();

}



public interface ITest

{

void Test();

void NewTest();

}



区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。



区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。



知道了两者的区别,再来说说,接口相对于抽象类的优势。

好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。



好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。



好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。



好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。



好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。

参看如下文章提供的方法。

http://blog.csdn.net/Knight94/archive/2006/10/08/1326326.aspx



相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改借口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,尤其当子类型对象隐式转换成基类对象进行访问的时候。

那么这时候,需要用接口结合虚方法来实现。参看IDisposable在继承类型中的实现方法。

http://blog.csdn.net/Knight94/archive/2006/10/10/1329214.aspx



其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更灵活一些。

总的来说,接口和抽象类是.Net为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。因此我并不强调用什么而不用什么,那么问题的关键在于,如何把这两种手段合理的应用到程序当中,这才是至关重要。

------解决方案--------------------


记得刚学的时候,老师说,我们今后要面向接口编程……

以前不理解这种话的含意,现在懂了,接口是什么,接口就是一种规范,一种定义在整个系统框架内的规范,凡是围绕着这个接口展开的,都可以用统一的方式去访问和控制。

抽象类其实只是把接口中的一部分东西固定了一下。
[解决办法]
去看我博客

标题:抽象类和接口的使用场合

http://blog.csdn.net/it_mpf/archive/2007/01/12/1481193.aspx


[解决办法]
以下是我学习抽象类时做的笔记希望对你有帮助:)
abstract与Interface的区别:

abstract可以有自己的数据成员也可以有非 abstract的成员方法!interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员)!从某种意义上说,interface是一种特殊形式的 abstract class。
abstract class 在C#中表示的是一种继承关系,一个类只能使用一次继承关系! 但是,一个类却可以实现多个interface。
在abstract class的定义中,我们可以赋予方法的默认行为(构造器)。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托。如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了 "one rule,one place " 原则,造成代码重复,同样不利于以后的维护。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
abstract class和interface所反映出的设计理念不同。其实abstract class表示的是 "is-a "关系,interface表示的是 "like-a "关系。

[解决办法]
LZ 你应该学会
http://www.baidu.com/s?ie=gb2312&bs=%BD%D3%BF%DA%CA%C7%B8%F8%CD%E2%C8%CB%D3%C3%B5%C4+%2C+%B3%E9%CF%F3%C0%E0%CA%C7%B8%F8%D7%D3%CB%EF%D3%C3%B5%C4&sr=&z=&cl=3&f=8&wd=%BD%D3%BF%DA++%B3%E9%CF%F3%C0%E0&ct=0
一大箩筐可以告诉你,50分很贵的~


接口是给外人用的 , 抽象类是给子孙用的
-----------------
还是要顶 :D


Hope help!

热点排行