接口、抽象类、抽象方法、虚方法 的区别(转)

这四个名词时非常容易混淆的:

首先说一下接口 与抽象类 的异同:

相同点:

1.他们的定义都跟类的定义很类似,抽象类多了个abstract关键字,接口用interface关键字。  public abstract class Person ; interface  IPreson

2.他们都不能实例化自己,也就是说都是用来被继承的。

3.抽象类中的抽象方法和接口方法一样,只需定义功能而没有方法体。

不同点: 

1.抽象类里除了有抽象属性、抽象方法外,还可以有普通字段、普通方法(当然可以有方法体啦); 

   接口中不能有字段,只能定义属性和方法(因为子类中需要实现这些 属性和方法,字段怎么实现呢??!!   - - !).

2.抽象类中的抽象成员(抽象属性、抽象方法)的访问修饰符不能为private(一般为public);

   接口中的属性和方法前没有访问修饰符(“公共汽车”,就是给大家用的,用啥修饰符啊);

2.子类继承抽象类中的抽象属性、抽象方法,需要override重写(非抽象成员不需要重写,通过继承方法自然就得到了非抽象成员);  

   子类继承接口中的属性、方法不需要override重写,且此属性和方法的修饰符必须为public(还是那句话,大家一起用嘛,肯定是public咯)。 

4.接口更像是一种规范,一种约束,规定继承于接口的所有类必须实现接口中定义的属性和方法。

5.一个子类只能继承一个抽象类,但却可以继承多个接口。

 

接下来是抽象方法 和虚方法 的异同:

其实可以把抽象方法看做是没有方法体的虚方法。

相同点:

1.抽象方法和虚方法都可以被重写。

 

不同点:

1.abstract 和virtual的关键字不同

 

2.抽象方法一定没有方法体,而虚方法可以有方法体。

 

 

下面写个例子说明一下:

 

 1     /// <summary>
 2     /// 一个手机的抽象类
 3     /// </summary>
 4     public abstract class Mobilephone 
 5     {
 6         private string _logo;
 7         public string Logo
 8         {
 9             get { return _logo; }
10             set { _logo = value; }
11         }
12         public abstract void Call();
13         public virtual void Callagain() 
14         {
15             Console.WriteLine("我再打一个电话");
16         }
17     }
18     
19     /// <summary>
20     /// 定义一个实体类,继承了一个抽象类及多个接口
21     /// </summary>
22     public class Nokia :Mobilephone,IClock,Ilistenmusic
23     {
24         public override void Call()
25         {
26             Console.WriteLine("NOKIA打电话没问题");
27         }
28         public void clock()
29         {
30             Console.WriteLine("NOKIA的手机也有闹钟功能");
31         }
32         public void listenmusic()
33         {
34             Console.WriteLine("NOKIA的手机还能听歌");
35         }
36         public override void Callagain() 
37         {
38             Console.WriteLine("算了,还是不打了");
39         }
40     }
41     /// <summary>
42     /// 下面定义了两个接口,为了说明可以继承多个接口
43     /// </summary>
44     public interface Ilistenmusic 
45     {
46         void listenmusic();
47     }
48     public interface IClock 
49     {
50         void clock();
51     }

在补充一个小例子,

 

这里有到很有意思的面试题,说名了new关键字和override的区别:

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             B5 b5 = new B5();
 6             b5.MethodB();
 7         }
 8     }
 9     public class A5
10     {
11         public virtual void MethodA()
12         {
13             Console.WriteLine("A5.MethodA");
14             Console.Read();
15         }
16         public virtual void MethodB()
17         {
18             MethodA();
19         }
20     }
21     public class B5 :A5
22     {
23         public new void MethodA() 
24         {
25             Console.WriteLine("B5.MethodA");
26             Console.ReadLine();
27         }
28     }

最后的答案是:"A5.MethodA"

转自:http://blog.csdn.net/tuziblog/article/details/4547662

posted @ 2013-07-26 15:55  solomonkiss  阅读(347)  评论(0)    收藏  举报