文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#接口、抽象类、抽象方法和虚方法的区别是什么

2023-06-17 12:52

关注

C#接口、抽象类、抽象方法和虚方法的区别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

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

相同点:

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

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

不同点:

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

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

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

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

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

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

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

相同点:

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

不同点

abstract 和virtual的关键字不同

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

下面写个例子说明一下:

/// <summary>  /// 一个手机的抽象类  /// </summary>  public abstract class Mobilephone   {  private string _logo;  public string Logo  {  get { return _logo; }  set { _logo = value; }  }  public abstract void Call();  public virtual void Callagain()   {  Console.WriteLine("我再打一个电话");  }  }  /// <summary>  /// 定义一个实体类,继承了一个抽象类及多个接口  /// </summary>  public class Nokia :Mobilephone,IClock,Ilistenmusic  {  public override void Call()  {  Console.WriteLine("NOKIA打电话没问题");  }  public void clock()  {  Console.WriteLine("NOKIA的手机也有闹钟功能");  }  public void listenmusic()  {  Console.WriteLine("NOKIA的手机还能听歌");  }  public override void Callagain()   {  Console.WriteLine("算了,还是不打了");  }  }  /// <summary>  /// 下面定义了两个接口,为了说明可以继承多个接口  /// </summary>  public interface Ilistenmusic   {  void listenmusic();  }  public interface IClock   {  void clock();  }

在补充一个小例子,

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

class Program   {   static void Main(string[] args)   {   B5 b5 = new B5();   b5.MethodB();   }   }   public class A5   {   public virtual void MethodA()   {   Console.WriteLine("A5.MethodA");   Console.Read();   }   public virtual void MethodB()   {   MethodA();   }   }   public class B5 :A5   {   public new void MethodA()   {   Console.WriteLine("B5.MethodA");   Console.ReadLine();   }   }   class Program  {  static void Main(string[] args)  {  B5 b5 = new B5();  b5.MethodB();  }  }  public class A5  {  public virtual void MethodA()  {  Console.WriteLine("A5.MethodA");  Console.Read();  }  public virtual void MethodB()  {  MethodA();  }  }  public class B5 :A5  {  public new void MethodA()   {  Console.WriteLine("B5.MethodA");  Console.ReadLine();  }  }

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

看完上述内容,你们掌握C#接口、抽象类、抽象方法和虚方法的区别是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯