博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 关键字---virtual
阅读量:6789 次
发布时间:2019-06-26

本文共 1572 字,大约阅读时间需要 5 分钟。

virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

虚拟成员的实现可由派生类中的重写成员更改,而非虚拟成员是无法由派生类进行重写的,这一点是与Java不同的。Java语言中,只要在派生类中定义了与父类具有相同签名的方法,那么父类的方法就被重写。C#语言中,必须使用virtual关键字进行修饰,否则在派生类中进行重写会导致编译器报错。

  虚方法或者虚属性并不等同于抽象方法、抽象属性抽象方法和抽象属性无法直接调用,必须通过派生类进行实现之后才能调用;而虚方法和虚属性是表示在派生类中有可能进行重写的,但是如果没有重写,那么将调用父类中的该虚方法和虚属性。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
    默认情况下,方法是非虚拟的,不能重写非虚方法(除非使用new关键字)virtual 修饰符不能与static、abstract、private 或 override 修饰符一起使用。除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。注意:
    在静态属性上使用 virtual 修饰符是错误的。
    通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
    若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法。若其中没有 virtual修饰符,则称该方法为非虚拟方法。非虚拟方法的实现是不会变的:无论是在声明它的类的实例上调用该方法还是在派生类的实例上调用,实现都是相同的。与此相反,一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法。例:

class A {
public void F() { Console.WriteLine("A.F"); } public virtual void G() { Console.WriteLine("A.G"); } } class B: A {
new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); } } class Test {
static void Main() {
B b = new B(); A ab = b;//这里a的类型是B类对象 A a = new A(); a.F(); //打印A.F b.F(); //打印B.F ab.F(); //打印A.F a.G(); //打印A.G b.G(); //打印B.G ab.G(); //打印B.G } }

   注意:从ab.F()与ab.G()返回的结果可以看出,利用new和override关键字对方法进行重写是有区别的。

基类对象调用基类对应的方法,不管是否是虚拟方法。

派生类对象分两种情况

①引用声明为派生类变量:调用派生类的方法
②引用声明为基类变量:
        ■如果利用override重写,那么调用派生类中的重写之后的方法。
        ■如果利用new重写,那么调用基类方法。

   注意:上述原则对虚拟属性同样适用!

 

转自:

转载于:https://www.cnblogs.com/li-jason/archive/2011/11/20/2255721.html

你可能感兴趣的文章
MASM的反反汇编技术
查看>>
Login failed for user 'sss'. The user is not associated with a trusted SQL Server connection.
查看>>
字节流与字符流的区别
查看>>
java动态代理
查看>>
[LeetCode] Combination Sum II
查看>>
JavaWS
查看>>
我对PostgreSQL 中 Bitmap Heap scan 与 Bitmap Index scan 的学习
查看>>
[AWDwR4]13章出错 protect_against_forgery
查看>>
Python科学计算库Numpy的使用
查看>>
Sublime-text gitHub 问题收集
查看>>
muduo多机协作网络编程示例一:单词计数及排序
查看>>
POJ-2029 Get Many Persimmon Trees 树状数组
查看>>
扩展方法必须在非泛型静态类中定义
查看>>
Winform开发框架之通用短信邮件通知模块
查看>>
Jquery插件汇集:
查看>>
线段树成段更新之延迟更新
查看>>
[代码分享] wxWidgets - wxDir 遍历文件
查看>>
Apache Tika源码研究(二)
查看>>
commandlinefu.com
查看>>
sjtu 1077 加分二叉树
查看>>