浅析C#中new、override、virtual关键字的区别

OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅。

一、在C#中,new这个关键字使用频率非常高,主要有3个功能:

a)     作为运算符用来创建一个对象和调用构造函数。

b)     作为修饰符。

c)      用于在泛型声明中约束可能用作类型参数的参数的类型。

在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。

这里有个注意事项就是New和Override这两个关键字是互斥的。不可以同时使用。

二、    Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或abstract 来修改 override 方法。

以下是一个小demo,展示了new和override的本质区别:

class Program

{

static void Main(string[]
args)

{

class1 ct1
= new class1();

contact ct2
= new class2();

ct1.prinf();

ct2.prinf();

}

}

abstract public class contact

{

public virtual void prinf()

{

Console.WriteLine
("这是虚方法");

}

}

public class class1 : contact

{

public override void prinf()

{

Console.WriteLine
("这是新的方法");

}

}

public class class2 : contact

{

public new void prinf()

{

Console.WriteLine
("这是另一个新的方法");

}

}

此demo运行结果为:

这是新的方法

这是虚方法

三、     Virtual 关键字允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、private、override一起使用。Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。

总结:New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方  
              
法和虚方法进行重写。

时间: 2024-07-30 10:08:00

浅析C#中new、override、virtual关键字的区别的相关文章

浅谈C#中new、override、virtual关键字的区别

OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的学习了下在设计模式中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来. 一.New 在C#中,new这个关键字使用频率非常高,主要有3个功能: a)   作为运算符用来创建一个对象和调用构造函数. b)   作为修饰符. c)   用于在泛型声明中约束可能用作类型参数的参数的类型. 在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说

【Java_基础】java中static与final关键字的区别

1.static关键字 经由static关键字修饰的成员为类成员,被所有对象所共享,通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jvm内存的方法区分配空间,并在类的初始化阶段赋初值. 一个类的static成员变量只有“一份”(存储在方法区),无论该类创建了多少对象.看如下的示例: public class StaticDemo { public static void main(String[] args) { People p1 = new People(18);

辛星浅析数据库中的几种关键字

首先就是候选关键字,它指的是,在给定关系中,具有唯一标识特性的一个或者多个属性被称为该关系的候选关键字.比如学生有身份证号和学号,那么这两个都可以作为学生这个实体的候选关键字. 然后就是主关键字,它也是一种候选关键字,它是被挑选出来的,作为行的唯一标识的候选关键字.一个表只能有一个主关键字,主关键字又可以称为主键,主键可以由一个字段,也可以有多个字段组成,分别称为单字段主键和多字段主键. 如果有一列可以唯一的确定一条记录,那么我们就可以称之为超关键字. 如果公共关键字在一个关系中是主关键字,那么

辛星浅析html中的name和id的区别

可能新手朋友们能够很轻松的区分id和class,但是却不一定能够很轻松的区分id和name,下面说一下二者的区别和联系. 首先是联系,它们都可以用来标记一个元素,而且可以用JavaScript来操作,但是操作方法不同,分别使用getElementById和getElementByName来定位DOM节点. 然后就是区别了,这个很简单,首先是一个纲要:name用于表单,id用于样式. 我们在做post提交数据的时候,为了区分表单内的各个元素,我们使用name来区分,我们是无法通过id来获取每个表单

C#中的override和new关键字

问题1: 虚方法 首先,看下面的代码. namespace CSharpTest { class A { public void fun() { Console.WriteLine("这是父类方法"); } } class B : A { public void fun() { Console.WriteLine("这是子类方法"); } } class Test { public static void Main() { A a = new A(); a.fun(

C++ 类的多态一(virtual关键字--构造函数深刻理解)

//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代码的编译,不会考虑上下文 例如编译到void ProtectA(Point pin) 编译器就会认为pin就是Point类型, 而不会去联系上下文,去分析pin有没有可能是子类对象 virtual关键字会自动检测这个父类对象有没有是子类对象 */ /* virtual关键字的作用 假设父类中存在用virtua

浅析C#中接口的重要性

C#中有了接口这一概念.我觉得接口就像是C++中的抽象基类. 接口可以理解为是一种约定,使得实现这个接口的类或是结构在形式上保持一致. 声明接口: 语法和声明抽象类完全相同.  public interface IBankAccount { void PayIn(decimal amount); bool Withdraw(decimal amount); decimal Balance { get; } } 注意:接口中只能包含方法.属性.索引器和事件的声明.不允许声明成员上的修饰符,即使是p

C#继承中abstract、virtual、override和new

abstract 详细参考:https://msdn.microsoft.com/zh-cn/library/sf985hc5.aspx abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类. 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现. 抽象类具有以下特性: - 抽象类不能实例化. - 抽象类可以包含抽象方法和抽象访问器. - 不能

override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字

 1.override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字 #include <iostream> //C++中的final和override主要是针对虚函数 //加了final表示拒绝重写,这是为了使某些情况下,拒绝接口的重写 //override,声明重写父类的方法,前提是要有virtual关键字修饰函数. //当父类没有接口,会提示错误 class ye { public: //final修饰的函数必须是虚函数,通过这种方式避免重写了一些老的接口