dot_net中抽象类和接口的区别

合集下载

抽象方法和接口的区别

抽象方法和接口的区别

抽象方法和接口的区别
抽象方法和接口是面向对象编程中的两个重要概念,它们之间存在以下区别:
1. 定义方式:抽象方法是在抽象类中定义的方法,使用关键字abstract修饰,没有方法体;接口是由方法签名组成的集合,使用关键字interface进行定义。

2. 继承关系:抽象方法通过继承的方式实现子类对该方法的重写,一个类只能继承一个抽象类;接口通过实现的方式实现对接口中方法的定义,一个类可以实现多个接口。

3. 状态:抽象方法可以有非抽象方法和属性,并可以包含构造函数,一个抽象类可以有自己的状态;接口只能包含抽象方法和常量,没有自己的状态。

4. 实例化:抽象方法不能直接被实例化,需要通过子类继承和重写来实现;接口不能被实例化,但可以通过实现类实例化,使用接口引用来调用实现类的方法。

5. 使用场景:抽象方法适用于需要有默认实现和状态的情况,可以用作基类从而提供一些共享的实现;接口适用于需要强制与不同类之间进行某种逻辑上的约束的情况。

总结来说,抽象方法提供了一种非强制性的基类实现,而接口则是一种强制性的实现规范。

抽象方法更强调类的继承和共享实现,接口更强调类的多态和实现规范。

C++中抽象类和接口的区别

C++中抽象类和接口的区别

C++中抽象类和接⼝的区别抽象类(abstract class)和接⼝(interface)的概念是⾯向对象设计中常⽤的概念, 也是⽐较容易混淆的概念. 在这⾥, 我提出⼀种区分它们的思路:1. 如果⼀个类B在语法上继承(extend)了类A, 那么在语义上类B是⼀个类A.2. 如果⼀个类B在语法上实现了(implement)接⼝I, 那么类B遵从接⼝I制定的协议.------------------------------------------------------------------------------------------------使⽤abstract class的根本原因在于, ⼈们希望通过这样的⽅式, 表现不同层次的抽象.⽽interface的本质是⼀套协议. 在程序设计的发展中, ⼈们⼜发现接⼝可以⽤来表⽰对⾏为的抽象, 不过, 这只是interface的⼀种⽤法不是其本质. ------------------------------------------------------------------------------------------------理论结合实际才是最好的学习⽅式, 不过在这⾥, 我只想举⼀些我见到过关于接⼝使⽤的反⾯教材:1. 在接⼝中包含数据成员. 这⼏乎肯定是错的, 因为协议是规范是标准, 不应该跟具体实现有任何牵连, 也不应该给具体实现造成任何负担.2. C++中 delete 掉⼀个接⼝. 例如:class IInterface(){Public:Virtual ~IInterface(){};…}Class ClassImpl : public IInterface{…}Int main(){IInterface* pInterface = new ClassImpl();…delete pInterface;}从语法的⾓度和语⾔⾃⾝的⾓度来看, 这是可⾏的, ⽽且只要将接⼝的析构函数设置为virtual, 就能避免内存泄漏.但我要说, 这不是语法和语⾔的问题, ⽽是从根本上就错了.因为接⼝是⼀套协议, ⼀套规范, 并不是实现.Delete ⼀个接⼝的代码, 到底想要表达什么样的语义? 如果⼀段代码从语义上都说不通, 就不应该出现在程序中.------------------------------------------------------------------------------------------------------------------------要在C++中表现接⼝的概念, ⼀种做法是这样:class IInterface{public:virtual void DoSomething() = 0;// 不应当有析构函数, 因为从语义上说, 接⼝是不能delete的.}如果要delete, 只能delete⼀个类的实例:Class A{Public:Virtual ~A();Public:Virtual void DoSomething() = 0;}Class B : public A{…}Int main(){A* pA = new B();…Delete pA;}我们可以这样做, 因为pA对应的是⼀个实例, 我们可以在A这⼀层将其销毁.先举个例⼦,⽅便⼤家理解,然后从例⼦中抽象概括出结理论。

C#抽象类和接口的区别

C#抽象类和接口的区别

C#抽象类和接口的区别c#接口和抽象类的区别大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料.一、抽象类:抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。

抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

二、接口:接口是引用类型的,类似于类,和抽象类的相似之处有三点:1、不能实例化;2、包含未实现的方法声明;3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。

除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

三、抽象类和接口的区别:1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。

”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;3.一个类一次可以实现若干个接口,但是只能扩展一个父类4.接口可以用于支持回调,而继承并不具备这个特点.5.抽象类不能被密封。

6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。

但是,允许抽象类将接口方法映射到抽象方法上。

抽象类和接口的相同和异同点

抽象类和接口的相同和异同点

抽象类和接口的相同和异同点声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。

不能创建abstract 类的实例。

然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。

接口(interface)是抽象类的变体。

在接口中,所有方法都是抽象的。

多继承性可通过实现这样的接口而获得。

接口中的所有方法都是抽象的,没有一个有程序体。

接口只可以定义static final成员变量。

接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。

在编写对象的时候会对一些类的方法进行定义。

但是并没有具体的实现。

而是把它们放到子类中去实现,具有灵活性。

在抽象类中可以有抽象方法,也可以没有抽象方法。

但是有了抽象方法的类一定是抽象类。

抽象类和接口在JA V A中都是用来表述抽象类的。

在面向对象的概念,所以的对象都是通过类来描述的。

但反之则不行。

若是一个类中没有包含足够的信息描绘一个具体的对象,这个的类就是抽象类。

在JA V A中除了使用抽象类来实现一定程度的抽象外还可以定义一种特殊的抽象方法----接口(interface)。

和抽象类的方法不一样,在抽象类中需要加上关键字abstract来表明某个方法是抽象的,但是在接口中则不需要。

相同点:1.他们都能不能生成实例,都有抽象方法。

2接口是特殊的抽象类。

3.接口和抽象类的继承都使用的关键字是extends。

不同点:1.接口的定义的变量默认是public static final型,且必须给其赋初值。

所以在实现类中不能重新定义,也不能改变其值。

而在抽象类中其值在子类中可以重新定义也可以重新赋值。

2.接口的方法默认的都是public abstract类型的。

3.抽象类中可以有构造器,但是接口中除了抽象方法什么都没有。

4.名字不同,接口写的是public interface Shape{};而抽象类写的是public abstract class Shape{};接口里全部都是抽象方法。

接口和抽象类的区别是什么?Java接口中声明的变量默认都是final的。(为什么)

接口和抽象类的区别是什么?Java接口中声明的变量默认都是final的。(为什么)

接⼝和抽象类的区别是什么?Java接⼝中声明的变量默认都是final的。

(为什么)接⼝和抽象类的区别是什么?参考答案Java提供和⽀持创建抽象类和接⼝。

它们的实现有共同点,不同点在于:接⼝中所有的⽅法隐含的都是抽象的。

⽽抽象类则可以同时包含抽象和⾮抽象的⽅法。

类可以实现很多个接⼝,但是只能继承⼀个抽象类类可以不实现抽象类和接⼝声明的所有⽅法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接⼝⽅法实现的情况下实现接⼝。

?Java接⼝中声明的变量默认都是final的。

(为什么)抽象类可以包含⾮final的变量。

Java接⼝中的成员函数默认是public的。

抽象类的成员函数可以是private,protected或者是public。

接⼝是绝对抽象的,不可以被实例化。

抽象类也不可以被实例化,但是,如果它包含main⽅法的话是可以被调⽤的。

也可以参考JDK8中抽象类和接⼝的区别问题1.Java接⼝中声明的变量默认都是final的。

(为什么)interface中的变量是当作常量来设计的,它不但是final,⽽且还是public static的,也即interface中的变量⼀定是public static final的,换⾔之,这个变量实际上已经是个“常量”。

解答:java接⼝中成员变量必须是final类型的原因如下:1. 接⼝中的数据对所有实现类只有⼀份,所以是static2.要使实现类为了向上转型成功,所以必须是final的.这个举例⼦很好理解.⽐如接⼝A,A有变量value.实现类A1,A2,可以向上转型.假如代码中有⼀句:A a=null;a=....(2)实际实现类System.out.println(a.value);利⽤向上转型,可以得到接⼝a的值,在第2步中,我不关你是实现类A1,还是new A2(),通过转型,我们可以得到正确的值.要是类中可以更改,我们得不到⼀个统⼀的值,接⼝也没有了意义.假设接⼝的成员变量x不是final的,且默认有值。

深入理解抽象类和接口的区别

深入理解抽象类和接口的区别

深入理解abstract class和interface城市WebClub2003-12-10 13:51:195816 次浏览abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在。

从语法定义层面看abstract class和interface在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo 的抽象类为例来说明这种不同。

使用abstract class的方式定义Demo抽象类的方式如下:abstract class Demo {abstract void method1();abstract void method2();…}使用interface的方式定义Demo抽象类的方式如下:interface Demo {void method1();同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。

因此,在abstract class和interface 间进行选择时要非常的小心。

从设计理念层面看abstract class和interface上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。

本小节将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。

作者认为,从这个层面进行分析才能理解二者概念的本质所在。

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的(参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述,有兴趣的读者可以参考)。

抽象类和接口等理解

抽象类和接⼝等理解简单介绍⼀下抽象类和接⼝?1.抽象类中的抽象⽅法前⾯有默认的abstract修饰,不能⽤其他修饰符去修饰,原因是:抽象⽅法中没有⽅法体,是⽤来被继承的,所以private修饰符没有作⽤,static修饰符可以直接使⽤类名来调⽤访问该⽅法,抽象⽅法⽤static修饰就没有意义,因为可以直接⽤类名来调⽤了;synchronized是为该⽅法添加⼀个锁,如果该关键字修饰的是⼀个static⽅法,则使⽤的锁就是class变量的锁,如果修饰的是类⽅法,则使⽤this变量锁,但是抽象类不能实例化对象,因为该⽅法不是在该抽象类中实现的,锁应该归其⼦类所有,所以抽象类⽅法不能⽤synchronized修饰符修饰。

(为啥不能⽤native修饰抽象⽅法):因为native修饰符和abstract修饰符本⾝就存在⼀种冲突,他们都是⽅法的声明,只不过native是把⽅法实现交给了本地系统,abstract是把⽅法的实现交给了⼦类,如果同时存在,那么就不确定到底是交给了本地还是⼦类,到底是谁来实现这个⽅法。

2.接⼝是⼀个特殊的抽象类,接⼝中的⽅法全部是抽象⽅法abstract,但其前⾯的abstract可以省略,所以抽象类中的抽象⽅法不可以⽤的修饰符这⾥也不可以⽤,(还存在⼀个protected修饰符???)因为定义接⼝就是为了让所有需要的类去实现,不只是其⼦类,但是要⽤public去修饰,接⼝可以去继承⼀个已有的接⼝。

抽象类中抽象⽅法和接⼝的使⽤:1.相同点:都不能被实例化,都包含抽象⽅法2.不同点:(1):接⼝只能包含抽象⽅法,抽象类可以包含普通⽅法(2):接⼝中不能定义静态⽅法,抽象类可以(3):接⼝中不能定义普通属性,只能定义静态常量属性,抽象类可以(4):接⼝中不包含构造器,抽象类可以(不是⽤于创建对象⽽是让⼦类完成初始化)(5):接⼝可以多继承,抽象类只能单继承(只能有⼀个直接⽗类)总结:接⼝中的所有⽅法全是抽象⽅法只能是public abstract修饰,属性默认public static final修饰,抽象类除了包含抽象⽅法外和普通⽅法⽆区别。

抽象类和接口的区别抽象类和接口的区别

抽象类和接口的区别-抽象类和接口的区别接口和抽象类有什么区别接口和象抽类的念概不一。

接样是对口动作抽的象,抽类象对是根源抽象。

的抽类象示的是,表这对个是什么象接口表。

的示,这是个对能做什象。

么比如,男,人女人这两个类…他们的抽,象是类。

人明说,们他都人是。

可以吃人东西狗,可也以吃东西你,以可把“吃东西定义成”一接口个,后然让些这去类现实它.所以,高级在言上,一个语类能只继承一类(抽如正不可人能时是生物和非同物生,但)可是实现以个接口多吃(饭口接走、路接)口。

第一点.接口抽象是的变体类接口中,所有方法的是都抽的。

而象抽类是象声明方的存法而不去实现它在类。

的二点第.接口可以承继抽,类象不行第三点.接定义口法,不方能现实,抽象类可以而现部分实方法。

第四点.接口基本数中类据型为sttac i抽而类象不的是。

当你注关一事物个本质的时的,用候象抽类当你关注一;操作的时候个用接,口。

接口可以实也可以现承,继抽类不象行象抽往往类用来征表们我在对问题领进行分域、析计中设出的得象概念,是抽对系列看上一去不同,是本但上质相同具体概念的抽象。

的以用征抽象概念的抽表象类不能是实例够化。

的使用bsartatcc lass方式定的义emo 抽D象的方类式下:如abtrscta cass Dleom{absrtca toiv dmetoh1()d;astracb tvodime thod2)(…}可;以自有己数的据成,员可以有非抽象也的成方员法;astbacr tlcas只s能单承;继abtractsc las可s赋以予方的默法认为行;bstraca ctals表s的是”示is-”关系a;抽象中的变量默类认是frinely d,其型值以可在类中重新子定,也可义重以新值赋;使i用tnrfece的方式a定Demo抽象义的类式方下如:interfca Deemo{oid vethomd1(;v)od iemthod2(;)}…只能够有静的不态被修改的数据能员有成的员方法是都abtsrcta;的从某意义上种说i,ntefacr是e一种特形殊的ab式srtcat lass;c一类却个以实现多可个itenracfe;niertface方法不的拥有默认行能,为可以使但用委托;intefacer示的是表”ilk-e”关系;a口中接不能实现方有法;接中口的法默方都是publ认ic astbrat c类型接口中定的义变默量认publi是cstticafin al ,型且必须其初给,实现值不能类重新义它,也定不改变能值其;抽象类与接口的区别Abstarcctass和inlt*e**c是Java语言中对e抽象于定类进义支行持的两机制,正是由种这两于机制的存在,种才予赋了Jva强a的大向面象对力能。

C#接口和抽象类的区别和使用场合(知识要点归纳总结)

C#接⼝和抽象类的区别和使⽤场合(知识要点归纳总结)
C# 接⼝和抽象类的区别和使⽤场合(知识要点归纳总结)
接⼝和抽象类的异同
相同点
1. ⼆者都不能实例化;
2. ⼆者都通过继承实现中的重写(override)实现抽象⽅法;
3. ⼆者都是OOP的基础,实现各种设计模式。

不同点
1. 接⼝⽀持多实现,⽽抽象类和具体类⼀样只能单⼀继承;
2. 接⼝只能定义抽象的⽅法,⽽抽象类除此以外可以定义具体⽅法;
3. 结构体能实现接⼝⽽不能继承抽象类;
使⽤场合
如果预计要创建组件的多个版本,则创建抽象类。

抽象类提供简单易⾏的⽅法来控制组件版本。

通过更新基类,所有继承类都随更改⾃动更新。

另⼀⽅⾯,接⼝⼀旦创建就不能更改。

如果需要接⼝的新版本,必须创建⼀个全新的接⼝。

如果创建的功能将在⼤范围的全异对象间使⽤,则使⽤接⼝。

抽象类应主要⽤于关系密切的对象,⽽接⼝最适合为不相关的类提供通⽤功能。

如果要设计⼩⽽简练的功能块,则使⽤接⼝。

如果要设计⼤的功能单元,则使⽤抽象类。

如果要在组件的所有实现间提供通⽤的已实现功能,则使⽤抽象类。

抽象类允许部分实现类,⽽接⼝不包含任何成员的实现。

备注
提炼:
1. 抽象类⽤在同类不同种的事物的抽象,把这些事物的通⽤⽅法写到抽象类中,进⾏全局的统筹;
2. 接⼝⽤在给不同类的事物提供通⽤的功能。

C#.NET里面抽象类和接口有什么区别

1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。如:

using System; public abstract class A //抽象类A { private int num=0;

public int Num //抽象类包含属性 { get { return num; } set { num = value; }

}

public virtual int getNum() //抽象类包含虚方法 { return num; }

public void setNum(int n) // //抽象类包含普通方法 { this.num = n; }

public abstract void E(); //类A中的抽象方法E

}

public abstract class B : A //由于类B继承了类A中的抽象方法E,所以类B也变成了抽象类 {

}

public class C : B { public override void E() //重写从类A继承的抽象方法。如果类B自己还定义了抽象方法,也必须重写 { //throw new Exception("The method or operation is not implemented."); } }

public class Test { static void Main() { C c = new C(); c.E(); } }

二、接 口 (1) 接口不能被实例化 (2) 接口只能包含方法声明 (3) 接口的成员包括方法、属性、索引器、事件 (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。如:

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.Net中抽象类和接口的区别 文章在我小站上的地址:.Net中抽象类和接口的区别 一、抽象类

(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。如:

using System;

public abstract class A //抽象类A { private int num=0;

public int Num //抽象类包含属性 { get { return num; } set { num = value; }

}

public virtual int getNum() //抽象类包含虚方法 { return num; }

public void setNum(int n) // //抽象类包含普通方法 { this.num = n; }

public abstract void E(); //类A中的抽象方法E

}

public abstract class B : A //由于类B继承了类A中的抽象方法E,所以类B也变成了抽象类 {

}

public class C : B { public override void E() //重写从类A继承的抽象方法。如果类B自己还定义了抽象方法,也必须重写 { //throw new Exception("The method or operation is not implemented."); } }

public class Test { static void Main() { C c = new C(); c.E(); } }

二、接 口

(1) 接口不能被实例化 (2) 接口只能包含方法声明 (3) 接口的成员包括方法、属性、索引器、事件 (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。如:

public delegate void EventHandler(object sender, Event e);

public interface ITest { //int x = 0;

int A { get; set; }

void Test(); event EventHandler Event;

int this[int index] { get;

set; } }

(5) 接口中的所有成员默认为public,因此接口中不能有private修饰符 (6) 派生类必须实现接口的所有成员 (7) 一个类可以直接实现多个接口,接口之间用逗号隔开 (8) 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员

三、抽象类和接口 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 (2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。” (3) 接口可以被多重实现,抽象类只能被单一继承 (4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中 (5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性 (6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法 (7) 接口可以用于支持回调,而继承并不具备这个特点 (8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的 (9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

使用规则: 1、抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能 2、如果要设计大的功能单元,则使用抽象类;如果要设计小而简练的功能块,则使用接口。 3、如果预计要创建组件的多个版本,则创建抽象类。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。 4、如果创建的功能将在大范围的全异对象间使用,则使用接口;如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。 5、分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”。为外部提供调用或功能需要扩充时优先使用接口 6、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染 7、尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则 例 如: Window窗体可以用抽象类来设计,可以把公有操作和属性放到一个抽象类里,让窗体和对话框继承自这个抽象类,再根据自己的需求进行扩展和完善。 打印操作可以作为一个接口提供给每个需要此功能的窗体,因为窗体的内容不同,就要根据他们自己的要求去实现自己的打印功能。打印时只通过接口来调用,而不用在乎是那个窗体要打印。

四、其它文章 共性、个性与选择 有的书上写到C#推荐使用接口(Interface)来替代抽象基类(Abstract Class),并强调使用接口的诸多好处,这点我不敢苟同,从上面列表中看来,两者之间还是存在不少差异的,而这种差异的存在性必然决定了适用场景的不同,例如在抽象基类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,提高代码的可重用性,这是抽象类的优势所在;而接口中只能包含抽象方法。至于何时使用抽象基类何时使用接口关键还是取决于用户是如何看待继承类之间的联系的,用户更加关心的是它们之间的个性差异还是它们之间的共性联系。举个生活中的例子加以说明。 如果给你三个对象分别是人、鱼、青蛙,让你为他们设计个基类来概括它们之间的联系,那么首先给你的感觉肯定是它们个体间的差异性较大,很难抽象出共性,然而若让你概括他们行为之间的共性,你可能想了想会意识到他们都会游泳,只不过是游泳方式迥异。那么这时你就应当考虑使用接口而不是抽象基类,原因有三条: 1. 个性大于共性。 2. 差异较大的个性间具有某些相同的行为。 3. 相同行为的实现方式有较大区别。 这时再给你三个对象,分别是鲫鱼、鲤鱼、金鱼,仍然让你设计基类来概括它们之间的联系,那么你第一个意识到的肯定是它们都属于鱼类,其次是他们游泳的方式可能稍有差异,这时就应当使用抽象基类而不是接口,对比着上面的例子,原因也有三条:

interface ISwim { void Swim(); }

public class Person : ISwim { public void Swim() { //Swimming in person's style. } }

public class Frog : ISwim { public void Swim() { //Swimming in frog's style. } }

public class Fish : ISwim { public void Swim() { //Swimming in fish's style. } }

1. 共性大于个性 2. 共性相同的个体间必然具有相同的属性与行为 3. 相同行为的实现方式具有一定区别

abstract public class Fish { abstract public void Swim(); }

public class 鲫鱼 : Fish { public override void Swim() { //Swim like a 鲫鱼 } }

public class 鲤鱼 : Fish { public override void Swim() { //Swim like a 鲤鱼 } }

public class 金鱼 : Fish { public override void Swim() { //Swim like a 金鱼 }

相关文档
最新文档