zoukankan      html  css  js  c++  java
  • c#中重写、隐藏、重载怎么区分?

    重载、重写和隐藏的定义:

    重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。

    重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的

      例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.

    隐藏:基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。

    重载时,根据参数选择调用的方法;

    重写时,访问父类子类皆调用子类的重写方法;

    隐藏时,访问父类则调用父类的方法,子类子类的方法。


    补充:重写override一般用于接口实现和继承类的方法改写,要注意

      1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

      2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

      3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

      4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

    这三个概念都是与OO中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧。

      重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

      覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

      隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是在多态的实现上。什么叫多态?简单地说就是一个接口,多种实现吧。
    1,重写,必然发生在基类和派生类中,其类函数用virtual修饰,派生类用override修饰
    2,隐藏,在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,这时候一般编 译时会报一个警,子类中的函数用new修饰一下就不报警了
    3,重载,必然发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关

    ------------

    参考

    http://topic.csdn.net/u/20110105/14/77e68d33-7ff2-4916-8a69-bba27d64af44.html

  • 相关阅读:
    Visual studio之C# 调用系统软键盘(外部"osk.exe")
    Visual studio之C# 重新定义Messbox的显示窗口位置
    Visual studio之C#的一些常见问题
    C8051F340之USB简介
    CentOS 安装 Sun JDK
    配置Tomcat以指定的身份(非root)运行
    CentOS6 root 用户 vi/vim 无法开启高亮
    删除 Mac OS X 中“打开方式”里重复或无用的程序列表
    快速建立Linux c/c++编译环境
    Ubuntu 安装 Sun JDK
  • 原文地址:https://www.cnblogs.com/weiyuxinghuacun/p/1983816.html
Copyright © 2011-2022 走看看