C#中Virtual与override分别有什么用途
2个回答
展开全部
virtual方法:
如果在父类中使用了virtual关键字,而在其派生类中有没有override或new关键字,而直接引用一个同名方法的话,编译器将会报告错误,并将使用new方法,及以忽略派生类中的方法的方式来运行。
为了是派生类的实例完全代替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现的。
使用virtual需注意:
virtual修饰符不能与static、abstract、private或override修饰符一起使用。
在静态属性上的使用virtual修饰符是错误的。
通过使用override修饰符的属性声明,可在派生类中重写virtual继承属性。
override方法:
override方法是提从基类继承的成员的新实现。通过override声明重写的方法称为重写方法。重写方法必须是virtual、abstract或override的。
如果在派生类中的方法前使用带有override的关键字,则派生类的对象将调用该方法,而不调用基类中的方法。
使用override需注意:
override生命不能更改virtual方法的可访问性。
override方法和virtual方法必须具有相同的访问级别修饰符。
不能使用修饰符new、static、virtual或abstract来修饰override方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
如果在父类中使用了virtual关键字,而在其派生类中有没有override或new关键字,而直接引用一个同名方法的话,编译器将会报告错误,并将使用new方法,及以忽略派生类中的方法的方式来运行。
为了是派生类的实例完全代替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现的。
使用virtual需注意:
virtual修饰符不能与static、abstract、private或override修饰符一起使用。
在静态属性上的使用virtual修饰符是错误的。
通过使用override修饰符的属性声明,可在派生类中重写virtual继承属性。
override方法:
override方法是提从基类继承的成员的新实现。通过override声明重写的方法称为重写方法。重写方法必须是virtual、abstract或override的。
如果在派生类中的方法前使用带有override的关键字,则派生类的对象将调用该方法,而不调用基类中的方法。
使用override需注意:
override生命不能更改virtual方法的可访问性。
override方法和virtual方法必须具有相同的访问级别修饰符。
不能使用修饰符new、static、virtual或abstract来修饰override方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
2017-04-17 · 知道合伙人软件行家
关注
展开全部
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields()
{}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine( "x={0},y={1} ",x,y);
}
}
当使用new B()创建B的实例时,产生什么输出?
--------------------------------------------
=========================================
x =1 y =0
new B()后首先执行
int x=1;
int y;
再执行B的构造函数时会调用基类构造函数先 于是执行
public A()
{
PrintFields();
}
而A中的PrintFields方法是virtual方法且B中已经用override关键字实现了该方法
于是会执行子类B中的PrintFields方法 Console.WriteLine( "x={0},y={1} ",x,y);
//注意此时还没有执行到B的构造函数 所以 y值为0
而后才执行到B的构造函数//此时 x=1 y =-1;
virtual修饰的方法为虚方法,暗示其子类最好有自己的实现
override修饰的方法为重写方法,表示覆盖了基类原有方法的实现
virtual修饰的方法
其子类除了override 还可用new来修饰
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields()
{}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine( "x={0},y={1} ",x,y);
}
}
当使用new B()创建B的实例时,产生什么输出?
--------------------------------------------
=========================================
x =1 y =0
new B()后首先执行
int x=1;
int y;
再执行B的构造函数时会调用基类构造函数先 于是执行
public A()
{
PrintFields();
}
而A中的PrintFields方法是virtual方法且B中已经用override关键字实现了该方法
于是会执行子类B中的PrintFields方法 Console.WriteLine( "x={0},y={1} ",x,y);
//注意此时还没有执行到B的构造函数 所以 y值为0
而后才执行到B的构造函数//此时 x=1 y =-1;
virtual修饰的方法为虚方法,暗示其子类最好有自己的实现
override修饰的方法为重写方法,表示覆盖了基类原有方法的实现
virtual修饰的方法
其子类除了override 还可用new来修饰
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询