浅谈接口、抽象类、抽象方法和虚方法的区别

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();

在补充一个小例子,

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

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

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

网站栏目:浅谈接口、抽象类、抽象方法和虚方法的区别
文章网址:http://www.shufengxianlan.com/qtweb/news45/375495.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联