接口、抽象类、抽象方法、虚方法 的区别(转)
这四个名词时非常容易混淆的:
首先说一下接口 与抽象类 的异同:
相同点:
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"
浙公网安备 33010602011771号