视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C# new和override的区别分析
2020-11-27 22:41:38 责编:小采
文档


昨天面试问到了new的几种用法以及与Override的区别,有点模糊

回来google下,new的用法有以下3中

1、运算符:初始化对象和调用构造函数

2、修饰符:隐藏基类方法

3、于在泛型声明中约束可能用作类型参数的参数的类型

至于作为修饰符和override的区别,看了下文章不太明白,写了个例子,运行结果,发现了差异,下面分享下代码: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
 class Program
 {
 abstract public class Test
 {
 public virtual void Prinf()
 {
 Console.WriteLine("Abstract Printf...");
 }
 
 }
 public class Class1 : Test
 {
 public override void Prinf()
 {
 
 Console.WriteLine("Class One Override Printf...");
 }
 }
 public class Class2 : Test
 {
 public new void Prinf()
 {
 
 Console.WriteLine("Class Two New Printf...");
 }
 }
 
 static void Main(string[] args)
 {
 Class1 cls1 = new Class1();
 Class2 cls2 = new Class2();
 cls1.Prinf();
 cls2.Prinf();
 ((Test)cls1).Prinf();
 ((Test)cls2).Prinf();
 Console.ReadLine();
 }
 }
}

运行结果如下:

相信大家也看明白了,原来是这样

new隐藏基类方法后,通过转换为基类型,仍然可以调用基类的虚方法;

而override则完全将基类的方法进行了重写,即使将子类型转换为基类型,调用的仍然是重写后的方法。。

所以new 是隐藏基类方法,而Override是重写基类方法咯

override是指“覆盖”,是指子类覆盖了父类的方法。子类的对象无法再访问父类中的该方法。new是指“隐藏”,是指子类隐藏了父类的方法,当然,通过一定的转换,可以在子类的对象中访问父类的方法。所以说C# new和override的区别是覆盖和隐藏

    以下是代码:

class Base 
{
	public virtual void F1() 
	{
	Console.WriteLine("Base's virtual function F1");
	}
	public virtual void F2() 
	{
	Console.WriteLine("Base's virtual fucntion F2");
	}
}
class Derived:Base 
{
	public override void F1() 
	{
	Console.WriteLine("Derived's override function F1");
	}
	public new void F2() 
	{
	Console.WriteLine("Derived's new function F2");
	}
}
class Program 
{
	public static void Main(string[] args) 
	{
	Base b1 = new Derived();
	//由于子类覆盖了父类的方法,因此这里调用的是子类的F1方法。也是OO中多态的体现 
	b1.F1();
	//由于在子类中用new隐藏了父类的方法,因此这里是调用了隐藏的父类方法 
	b1.F2();
	}
}

下载本文
显示全文
专题