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 ...
随机推荐
- 选择恐惧症的福音!教你认清MVC,MVP和MVVM(转:示例挺好,不太赞同画图)
转自:http://zjutkz.net/2016/04/13/%E9%80%89%E6%8B%A9%E6%81%90%E6%83%A7%E7%97%87%E7%9A%84%E7%A6%8F%E9%9 ...
- Vue的路有拦截与axios的封装
一丶首先我们先创建api与utils两个文件夹 二丶api文件夹里面新建文件api.js import request from "../utils/http" import qs ...
- MariaDB 选择查询
在本章中,我们将学习如何从表中选择数据. SELECT语句检索所选行. 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询. 查看 ...
- Python--前端基础之JavaScript(JS的引入方式,JS的变量、常量和标识符,JS的数据类型,运算符,流程控制,JavaScript的对象)
JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释执行的,前端脚 ...
- kubernetes session保持、容器root特权模式开启、多端口容器service 2个端口开启等设置
session保持如何在service内部实现session保持呢?当然是在service的yaml里进行设置啦. 在service的yaml的sepc里加入以下代码: sessionAffinity ...
- docker容器管理-含静态Ip(10)
docker run命令详解 docker run -t #表示分配一个伪终端 -i #表示让容器的标准输入打开,不跟这个参数容器启不来 -d #后台运行 -P #dockerfile中EXPOSE ...
- Spring核心——Bean的依赖注入
依赖注入在设计模式与IoC这篇文章中,介绍了Spring基础的三大支柱的两项内容——IoC.Bean.本篇将继续围绕着Bean的创建时的注入方式来介绍Spring的核心思想与设计模式. 天底下所有面向 ...
- 72、salesforce call RESTful 的方式
通过Chrome的Postman 来call salesforce的restful api https://login.salesforce.com/services/oauth2/token?gra ...
- WEBI更换数据源
有些时候,我们需要更换数据源.例如切了系统.重新导入数据源,这样我的webi重做的工作量太大.一些变量之类的.替换数据源就很好的解决.不过它应当是对大致80%甚至100%相似的数据源.具体业务具体分析 ...
- Linux中TLS
TLS(Thread Local Storage) 线程局部存储. 在Linux操作系统中,TLS保存成GDT中描述的一个段. 1: /* 2: * This creates a new proces ...
