C#中重载与重写区别分析

一、前言
       接触面向对象的思想已经有一段时光了,为什么要学习面向对象呢?因为面向对象具有可复用性、可维护性、可扩展性等优点。
        本人之前一直接触的是VB语言,所以正式接触面向对象的编程语言还要从C#开始。前段时间,刚学完C#,其中重载、重写傻傻分不清楚。如今通过查阅资料对这两者有了一个大概的理解,不足之处还请多多指教。
二、定义
        重载:在同一定义域内(比如一个类里面)。方法名相同,参数个数、次序、类型不同。因此重载对返回值没有要求,可以相同,也可以不同。但是如果方法名相同,参数个数、次序、类型都相同,而返回值不同,则无法构成重载。
       重写:继承时发生,在子类中重写定义父类中的方法,子类中的方法和父类中的方法是一样的。即方法名、参数的个数、次序、类型和返回值都相同。例如父类方法声明为virtual(虚方法),子类中使用override申明此方法的重写。
三、示例
1、重载:
       我们建立一个猫类,在这个类中构造两个方法。一个是带参数姓名的方法,另一个是不带参数姓名的方法。这样当我们初始化一个“猫”的对象时,就可以选择给对象起名或者不起名。从而达到扩展的目的。

2、 重写:
       比如动物都有“叫”的方法。猫和狗是它的子类,猫的叫声是“喵”,狗的叫声是“汪”,如何在子类中重写父类的方法呢?首先在动物类中构造一个虚方法。

Class Animal
{
   public virtual string Shout()//注意修饰符中增加了一个virtual,它表示此方法是虚方法,可以被子类重写
   {
   return "";
   }
} 

在构建猫这个类时,我们重写“叫”这个方法

Class cat:Animail
{
  Public override string Shout()
  {//关键字override,表示方法重写
  string result="喵";
  return result;
  }
} 

在构建狗这个类时,我们也重写“叫”这个方法

Class Dog:Animal
{
  public override string Shout()
  {
   string result="汪";
   return result;
   } 

} 

重写发生在父类和子类之间,声明的是父类,实例化的是子类。本例子实现了多态。
四、小结

重载必须发生在一个类中,方法名相同,参数不同。值得注意的是,方法重载必须通过参数不同来判断调用哪个方法,而不能通过返回值。
         重写override一般用于接口实现和继承类的方法改写。值得注意的是,被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有进行覆盖。

以上就是本文的全部内容,希望大家对C#中重载与重写的异同有所了解,谢谢大家的阅读。

(0)

相关推荐

  • 基于C#方法重载的总结详解

    1.首先解释一下什么是方法重载? 方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术. 这里所说的参数不同是指以下几种情况: ①  参数的类型不同 ②  参数的个数不同 ③  参数的个数相同时他们的先后顺序不同 注意:系统会认为是同一个方法的两种情况,这样的两个方法不可以在同一个类里,否则系统会报错. ⑴返回类型不同,方法名和参数个数.顺序.类型都相同的两个方法 ⑵返回类型相同,方法名和参数的个数.顺序.类型都相同的两个方法,但是参数的名字不同

  • C#重载运算符详解

    本文较为详细的描述了重载运算符的方法.一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的运算符(如:+-*/),就能让编程工作带来方便:重载运算符就是告诉编译器+-*/等运算符对于自定义类型进行什么样的操作,在代码中需要注意几点. 一.尽可能的不要改变运算符本身的含义 二.所有的运算符重载都必须声明为public和static 三.不同于扩展方法,所重载的方法必须是在被重载的类型内部,且用关键字operator C#中的两个字符串相加,实际上是

  • C#运算符重载用法实例分析

    本文实例讲述了C#运算符重载用法.分享给大家供大家参考.具体分析如下: public class Plane { public virtual double TopSpeed() { return 300.0D;} public static bool operator>(Plane one, Plane two) { return one.TopSpeed() > two.TopSpeed(); } public static bool operator<(Plane one, Pla

  • C#中多态、重载、重写区别分析

    本文实例总结了C#中多态.重载与重写的概念与区别.对于初学C#的朋友来说有不错的参考价值.分享给大家供大家参考.具体分析如下: 重写:是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式如下: 1.在基类中: public virtual void myMethod() { } 2.在子类中: public override void myMethod() { } 重写以后,用基类对象和子类对象访问myMethod()方法,结果都是访问在

  • c#重写TabControl控件实现关闭按钮的方法

    1.c#里面的TabControl控件没有关闭按钮,而且很难看. 2.有一些已经做好的第三方控件,但是收费. 3.由于我的故障树推理诊断项目在绘图的时候允许同时打开多个文档进行操作,就要实现类似于浏览器的多标签功能,而且要可以关闭. 4.所以自己写一个类继承TabControl类,然后重写一些里面的方法即可实现. 5.特色:有关闭按钮,标签有背景颜色,选中的标签和没选中的颜色不一样,实现鼠标中键和右键的功能 先看我的项目中的完整代码,有很多代码是我的项目需要,可根据你的项目需求删减,核心的代码后

  • c# 重载WndProc,实现重写“最小化”的实现方法

    code #1 复制代码 代码如下: private void Form1_SizeChanged(object sender, EventArgs e) //最小化隐藏窗体 { if (this.WindowState == FormWindowState.Minimized)//窗体状态为最小化 { StopRectTimer.Enabled = false; this.Visible = false; this.notifyIcon1.Visible = true; //显示系统托盘图标

  • C#通过重写Panel改变边框颜色与宽度的方法

    本文实例讲述了C#通过重写Panel改变边框颜色与宽度的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Windows.Forms; using System.Drawing; namespace Imag

  • C#中重载相等(==)运算符示例

    运算符重载一直是一个很诡异事情,因为在写代码的时候,不知道某个运算符有没有被重载过.在 C++ 里面,运算符重载可以写在类的外面,当 intellisense 不工作的时候,找到一个运算符的重载函数是一件相当头疼的事情.这个问题在 C# 中改善了不少,因为运算符重载一定要写在类内,而且 intellisense 很强大.不过另一个问题又产生了-- 先来看 C++ 中的"=="重载: struct A{ int x; int y; }; inline bool operator == (

  • c#方法重写和隐藏的学习示例

    最近正在学习c#,对其中的方法重写和隐藏的概念很是模糊,现在将其归纳如下: 1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行重写(override),这样基类中的方法已经被重写了,已经失去了功能了.当让基类的对象的引用直接指向继承类的对象时(多态性),调用该方法则是调用的继承类的方法. 2:方法隐藏:无论基类中的方法是否用了virtual关键字,继承类中都可以用new关键字(如果不用new的话,不会产生错误,但会生成一个编译警告)将基类中的方法隐藏,所谓隐藏

  • C#中重载与重写区别分析

    一.前言        接触面向对象的思想已经有一段时光了,为什么要学习面向对象呢?因为面向对象具有可复用性.可维护性.可扩展性等优点.         本人之前一直接触的是VB语言,所以正式接触面向对象的编程语言还要从C#开始.前段时间,刚学完C#,其中重载.重写傻傻分不清楚.如今通过查阅资料对这两者有了一个大概的理解,不足之处还请多多指教. 二.定义         重载:在同一定义域内(比如一个类里面).方法名相同,参数个数.次序.类型不同.因此重载对返回值没有要求,可以相同,也可以不同.

  • C++中重载、重写(覆盖)和隐藏的区别实例分析

    本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int i); void test(double i); void test(int i, double j); void te

  • 实例分析java中重载与重写的区别

    本文以实例详细分析了Java中重载与重写的区别,感兴趣的朋友可以参考一下. 一.重载(Overloading): (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方

  • Java中重载与重写的对比与区别

    Java中重载与重写的区别 首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样

  • JS中getYear()和getFullYear()区别分析

    js中得到当前年份做法是var dayObj=new Date(); dayObj.getYear()来得到年份,我前面写过这样会出现浏览器的兼容性的问题,就是在IE中能得到我们想要的结果但是在FF中就不行了,和我们要的结果相差1900年.当时我的做法是: var dayObj=new Date(); var myYears = ( dayObj.getYear() < 1900 ) ? ( 1900 + dayObj.getYear() ) : dayObj.getYear(); docume

  • php中instanceof 与 is_a()区别分析

    instanceof 运算符 和 is_a() 方法都是判断:某对象是否属于该类 或 该类是此对象的父类(用于确定一个 PHP 变量是否属于某一类 class 的实例) 是的话返回 TRUE,不是的话返回 FALSE 区别: instanceof 运算符是 PHP 5 引进的.在此之前用 is_a(),但是后来 is_a() 被废弃而用 instanceof 替代了. 注意: PHP 5.3.0 起,又恢复使用 is_a() 了. 总结: 现在PHP的服务环境普遍都使用PHP5.0+了,所以尽量

  • PHP中spl_autoload_register()和__autoload()区别分析

    关于spl_autoload_register()和__autoload(),相信大多数都会选择前者了? 看两者的用法: 复制代码 代码如下: //__autoload用法function __autoload($classname){    $filename = "./class/".$classname.".class.php";    if (is_file($filename))    {        include $filename;    }} /

  • mybatis中${}和#{}取值的区别分析

    mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${paramName} #{paramName} 那如何理解这两种传参方式呢?如下带你走近背后的奥义. 先来回顾下原生Jdbc查询: public static void main(String[] args) throws Exception { // sql语句 String sql = "sele

  • C#中重载重写和覆盖的定义与区别

    一.重载 1.重载示意 重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字.通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思. 2.发生条件 必须发生在一个类中,函数名相同,参数类型或者个数不同构成重载,与返回类型无关. 如: Public class Name { Public string GetName(string username) { Return username; } Public

随机推荐