浅谈接口、抽象类、抽象方法和虚方法的区别
创始人
2024-08-01 22:01:01
0

C#抽象类接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意。其实,两者之间还是有很大区别的。

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

相同点:

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

2.抽象类中的抽象方法和接口方法一样,都不能有方法体

不同点:

1.抽象类里可以有字段,接口中不能有字段.

2.抽象类中的普通方法可以有方法体,而接口方法没有方法体。

3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 .

4.接口更像是一种规范,一种约束。

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

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

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

相同点:

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

不同点

1.abstract 和virtual的关键字不同

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

下面写个例子说明一下:

 

  1. ///   
  2. /// 一个手机的抽象类  
  3. ///   
  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. /// 定义一个实体类,继承了一个抽象类及多个接口  
  20. ///   
  21. public class Nokia :Mobilephone,IClock,Ilistenmusic  
  22. {  
  23. public override void Call()  
  24. {  
  25. Console.WriteLine("NOKIA打电话没问题");  
  26. }  
  27. public void clock()  
  28. {  
  29. Console.WriteLine("NOKIA的手机也有闹钟功能");  
  30. }  
  31. public void listenmusic()  
  32. {  
  33. Console.WriteLine("NOKIA的手机还能听歌");  
  34. }  
  35. public override void Callagain()   
  36. {  
  37. Console.WriteLine("算了,还是不打了");  
  38. }  
  39. }  
  40. ///   
  41. /// 下面定义了两个接口,为了说明可以继承多个接口  
  42. ///   
  43. public interface Ilistenmusic   
  44. {  
  45. void listenmusic();  
  46. }  
  47. public interface IClock   
  48. {  
  49. void clock();  
  50. }  

 

在补充一个小例子,

这里有到很有意思的面试题,说名了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. }   
  29. class Program  
  30. {  
  31. static void Main(string[] args)  
  32. {  
  33. B5 b5 = new B5();  
  34. b5.MethodB();  
  35. }  
  36. }  
  37. public class A5  
  38. {  
  39. public virtual void MethodA()  
  40. {  
  41. Console.WriteLine("A5.MethodA");  
  42. Console.Read();  
  43. }  
  44. public virtual void MethodB()  
  45. {  
  46. MethodA();  
  47. }  
  48. }  
  49. public class B5 :A5  
  50. {  
  51. public new void MethodA()   
  52. {  
  53. Console.WriteLine("B5.MethodA");  
  54. Console.ReadLine();  
  55. }  
  56. }  

 

***的答案是:"A5.MethodA"

【编辑推荐】

  1. 分享c#常用函数和方法集
  2. c#.net实体类序列化方法
  3. C#中的闭包是怎么捕获变量的
  4. 解析C#委托、时间和Lambda表达式
  5. 用C#实现HTTP协议下的多线程文件传输

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...