使用new关键字来做调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
public class Aminal
{
public string Name; // 定义宠物的名字
public void PrintName()
{
Console.WriteLine("宠物的名字:" + Name);
}
}
// Dog继承Aminal类
public class Dog : Aminal
{
// 隐藏父类的PrintName
new public void PrintName()
{
Console.WriteLine("名字为:" + Name);
}
}
static void Main(string[] args)
{
// 使用new关键字隐藏,取决于通过什么类型的调用
//Dog dog = new Dog(); // 打印的是使用Dog里面的PrintName的方法
Aminal dog = new Dog(); // 调用的是Aminal里面的PrintName的方法
dog.Name = "your name";
dog.PrintName();
}
}
}

使用vitual虚方法和override重写

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
public class Aminal
{
public string Name; // 定义宠物的名字
// 定义虚方法
virtual public void PrintName()
{
Console.WriteLine("宠物的名字:" + Name);
}
}
// Dog继承Aminal类
public class Dog : Aminal
{
// 重写
public override void PrintName()
{
// base.PrintName(); // 这个是调用父类的虚方法
Console.WriteLine("这是重写方法,{0}", this.Name);
}
}
static void Main(string[] args)
{
Aminal dog = new Dog(); // 输出的是重写方法的内容
dog.Name = "your name";
dog.PrintName();
}
}
}

虚方法需要注意的地方:

1.重写虚方法必须要使用相同的可访问属性,如:private就不可以

2.不能重写static和非虚方法

3.方法、属性、索引器、事件都可以使用虚方法重写

override:重写父类的方法。

new:用来隐藏父类的方法。

主要区别在于:override不管使用的是父类声明还是子类声明,调用的都是override重写后的方法;new则不一样,如果声明时使用的是父类,那么姜辉调用父类的virtual方法,如果使用的是子类声明,那么调用的是子类new声明的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO; namespace ConsoleApplication3
{
class OneClass
{
public virtual void a_func()
{
Console.WriteLine("这是virtual方法...");
}
}
class TwoClass : OneClass
{
public override void a_func()
{
Console.WriteLine("这是override方法...");
}
}
class ThreeClass : OneClass
{
public new void a_func()
{
Console.WriteLine("这是new方法...");
}
}
class Program
{
static void Main(string[] args)
{
// 子类声明
OneClass a = new OneClass();
a.a_func(); // 输出"这是virtual方法..."
TwoClass b = new TwoClass();
b.a_func(); // 输出"这是override方法..."
ThreeClass c = new ThreeClass();
c.a_func(); // 输出"这是new方法..."
// 上面三种都很容易理解。
// 关键是下面这两种,父类声明
OneClass d = new TwoClass();
d.a_func(); // 输出"这是override方法..."
OneClass e = new ThreeClass();
e.a_func(); // 输出"这是virtual方法..."
Console.ReadKey();
}
}
}

C# 虚方法、override和new的更多相关文章

  1. C# 方法 虚方法的调用浅谈 引用kdalan的博文

    我们在面试中经常碰到有关多态的问题,之前我也一直被此类问题所困扰,闹不清到底执行哪个方法. 先给出一道简单的面试题,大家猜猜看,输出是?     public class A    {         ...

  2. 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系

    1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...

  3. 1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写

    总结: 1. 在继承上, new/override没区别 2. 在多态上,new不支持多态,override支持 在C#中改变类中相同名称的方法的实现过程中有三种方式:重载.重写和覆盖. 重载:指具有 ...

  4. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  5. 重写ValidateEntity虚方法实现可控的上下文验证和自定义验证

    上篇文章介绍了ValidationAttribute和IValidatableObject.Validate验证,但是这种验证还是稍微简单了,对于复杂的实体,例如:继承过来的实体.实现某接口的实体等等 ...

  6. Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息

    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...

  7. 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  8. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  9. 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?

      首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...

随机推荐

  1. 新建oracle数据库表空间及删除表空间和用户

    进入oracle的命令控制台,按具体情况执行以下命令: sqlplus 默认数据库普通用户登录sqlplus / as sysdba 默认数据库管理员登录sqlplus username/passwo ...

  2. dubbo 框架文档地址

    http://dubbo.apache.org/books/dubbo-dev-book/ http://dubbo.apache.org/books/dubbo-admin-book/ http:/ ...

  3. Sphinx将python代码注释生成文档

    安装 使用pip进行安装: pip install sphinx 初始化 进入你代码所在的目录,输入: sphinx-quickstart 下图:PRD是代码所在目录,生成的文档保存目录设成doc  ...

  4. 了解数据模型、以及MySQL使用的数据模型

    1.什么是数据模型? 数据模型是数据库系统的核心与基础,是关于数据与数据之间的联系.数据的语义.数据一致性约束的概念性工具的集合. 数据模型的三个组成部分: 数据结构.数据操作.完整性约束. 数据操作 ...

  5. ss linux终端配置

    最近ss莫名宕机,懒得重新安装了,就安装了一个非gui版本,安装非gui版本还有一个优点就是在远程服务器的时候可以用proxychains进行终端代理,非常友好实用.下面简单的说一下如何进行终端ss ...

  6. 深度学习环境配置Ubuntu16.04+CUDA8.0+CUDNN5

    深度学习从12年开始打响,配置深度学习环境软件一直是一个头疼的问题,如何安装显卡驱动,如何安装CUDA,如何安装CUDNN:Ubuntu官方一直吐槽Nvidia显卡驱动有问题,网上大神也给出了关闭li ...

  7. 20155219 2016-2017-2 《Java程序设计》第7周学习总结

    20155219 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为 ...

  8. xdoj--1077: (循环节长度)

    1077: 循环节长度 时间限制: 1 Sec  内存限制: 128 MB提交: 103  解决: 37[提交][状态][讨论版] 题目描述 数一有很多的有理数,然而有的是有限小数,如1/2=0.5, ...

  9. find 以及linux 和windows 文件互传

    1. find  命令  查找文件或目录 同时也会用到的有 which   whereis   locate   经常也会遇到一些快捷键  ctrl  +  l  e  a  w  u  k     ...

  10. BFS模板

    bool visit[maxn];///访问标记 ,,,,-,,-,}; ///向左上右下,左下,右上,右下,左上 ,,,-,-,,,-}; struct node { int r; int c; i ...