1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写
总结:
1. 在继承上, new/override没区别
2. 在多态上,new不支持多态,override支持
在C#中改变类中相同名称的方法的实现过程中有三种方式:重载、重写和覆盖。
重载:指具有相同的方法名,通过改变参数的个数或者参数类型实现同名方法的不同实现。
重写:则是只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法
覆盖:则是指在继承中,子类通过在与父类相同方法名之前用new修饰的一个新的方法的定义
1.new ---- 子类隐藏父类的方法,覆盖(总结:new关键字不支持多态)
下面的例子我们可以发现new 关键字,并不支持多态的应用
我们使用多态调用的任然还是父类中的方法,也就是被隐藏的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Father fa = new Son();
fa.print();
}
} class Father
{
public void print()
{
Console.WriteLine("我是父类");
}
} class Son : Father
{
public new void print()
{
Console.WriteLine("我是子类");
}
}
}
输出:
如果我们使用了多态创建了实例,要调用子类重写的方法,需要强制转换成子类类型,实例如下:
class Program
{
static void Main(string[] args)
{
Father fa = new Son();
Son so = (Son)fa;
so.print();
}
}
输出:
2.virtual-- 重写 abstract--实现 (总结:这两种都支持多态)
a.重写父类的方法要用到override关键字(具有override关键字修饰的方法是对父类中同名方法的新实现)
b.要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型。(virtual修饰的可以有方法体,子类不一定要重写 abstract没有方法体,子类必须要实现)
C.virtual关键字用于将方法定义为支持多态,有virtual关键字修饰的方法称为“虚拟方法” 实例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Father fa = new Son();
fa.print();
}
} class Father
{
public virtual void print()
{
Console.WriteLine("我是父类");
} } class Son : Father
{
public override void print()
{
Console.WriteLine("我是子类");
}
}
}
输出:
1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写的更多相关文章
- Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)
Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型 ...
- C#之类的继承、抽象类和虚方法
代码下载地址 类的继承: 写电池的基类:包含条码和箱体码两个字段,含有两个参数的构造函数 class Battery { public string _barCode; public string _ ...
- java继承-子类调用父类的方法中包含子类重写的方法
# 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了... # 先看代码: public class Common { public static void main(String[] args ...
- C#继承机制 访问与隐藏基类成员
(1) 访问基类成员 通过base 关键字访问基类的成员: 调用基类上已被其他方法重写的方法. 指定创建派生类实例时应调用的基类构造函数. 基类访问只能在构造函数.实例方法或实例属性访问器中进 ...
- 【M24】了解虚方法、多继承、虚基类、RTTI的成本
1.编译器必须实现出C++语言的特性.一般情况下,我们只需要使用这些特性就好了,不需要关心内部的实现细节.但是,有些特性的实现,会对对象的大小和成员方法的执行速度造成影响.因此,有必要了解内部实现的细 ...
- 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?
首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- C#有关虚方法要知道的知识点:
虚方法:这个方法其实就是为了重写方法而存在的(在声明中包含virtual关键字),否则没感觉到它存在的意义. 其一:因为要重写所以它的访问类型如果为private则毫无意义阻碍了重写动作的进行也就是它 ...
- C#三大方法:虚方法、静态方法、实例方法
虚方法:使用virtual关键字定义,当子类继承父类时,可以对父类中的虚方法进行重写. 如下面代码中的类B,它继承类A,类A实现了接口I(实现了接口中的foo()方法).在类A中使用virtual将f ...
随机推荐
- 【Java学习笔记】2015.1.5
1.classpath中的“.”表示当前的路径,所以配置classpath时要注意不能忘了“.”.如果不注意,会出现cmd下运行程序时,.java文件可以编译但是不能运行: 一般的classpath配 ...
- array_reduce — 用回调函数迭代地将数组简化为单一的值
定义和用法 array_reduce() 函数向用户自定义函数发送数组中的值,并返回一个字符串. 注释:如果数组是空的且未传递 initial 参数,该函数返回 NULL. 说明 array_redu ...
- git小乌龟图标不显示 windows系统
1.修改注册表[windows + R 输入 regedit]进入注册信息,按照步骤找到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre ...
- js手机端图片弹出方法
1 $("img").click(function(){ //获取窗口可视大小 var width=$(window).width(); var height=$(window). ...
- python 学习 -- 第一天 初涉
久闻python大名却一直没去了解,趁学校培训这个机会 开始正式学习python 第一天初步介绍一点关于python的东西 安装了环境及编译器 环境是在之前就安装了 只安装编译器anaconda 之后 ...
- 【LeetCode 35】搜索插入位置
题目链接 [题解] 还是那句话,想知道l或者r所在的数字的含义 就想想它最后一次执行的时候在干什么就行. [代码] class Solution { public: int searchInsert( ...
- Android学习拾遗
1. java中的flush()作用:强制将输出流缓冲区的数据送出. 2. 文件存储: 存储到内部:另外使用一个class实现,最开始初始化用了this,后来放在这里不合适,改成了带参数的构造方法. ...
- js的 算法 和 数据结构
js的 算法 1.对一个对象数组按照对象某个属性进行排序 : https://www.cnblogs.com/webcabana/p/7460038.html 在做公交的项目中就碰到过这种算法问题, ...
- cent OS 7 下安装 python 3.6
step1:安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readli ...
- jQuery Mobile 自定义导航条图标
1.jQuery Mobile 自定义导航条图标