使用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. HDU 6103 17多校6 Kirinriki(双指针维护)

    Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑i=0n− ...

  2. endnote插入文献的一些问题

    1. 文末参考文献前面加上序号 eg.[1] 设置如下图,参考网址https://zhidao.baidu.com/question/360201207639069172.html edit-> ...

  3. freemarker 获取当前日期

    在freemarker中获取当前日期:${.now}获取当前日期并比较:<#if holdDate?date gt .now?date>.........</#if> 如果要做 ...

  4. Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 配置校验器

    Spring4新特性——泛型限定式依赖注入 Spring4新特性——核心容器的其他改进 Spring4新特性——Web开发的增强 Spring4新特性——集成Bean Validation 1.1(J ...

  5. js获取当天零点的时间戳

    var now_date = new Date();//获取Date对象now_date.setHours(0);//设置小时now_date.setMinutes(0);//设置分钟now_date ...

  6. DG增量恢复

    本篇文档: 讲述DG环境出现GAP归档缝隙,且主库的该归档日志被删除的情况下,快速恢复DG的连通性 流程讲述: >明确主库增量备份起点 scn 查询备库控制文件current scn ,及v$d ...

  7. 【算法】QuickSort

    快速排序,时间复杂度O(N*logN),要能熟练掌握! 以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主! 该 ...

  8. [LeetCode&Python] Problem 788. Rotated Digits

    X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...

  9. jQuery事件委托方法 bind live delegate on

    1.bind    jquery 1.3之前 定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数 语法:  bind(type,[data],function(e)); 特点: a.适合页 ...

  10. dfs——n的全排列(回溯)

    #include <iostream> #include <cstring> #include <string> #include <map> #inc ...