博客
关于我
C#开发之——virtual关键字(6.8)
阅读量:94 次
发布时间:2019-02-26

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

一、C#虚拟关键字概述

在C#中,virtual关键字用于定义虚拟成员,这些成员可以在子类中重写。默认情况下,类中的成员是非虚拟的。如果需要子类能够重写父类成员,需要在父类中使用virtual修饰这些成员。虚拟成员允许子类在不改变父类方法签名的情况下,重新实现父类的行为。

二、虚拟关键字的语法形式

2.1 使用virtual修饰属性

属性可以使用virtual关键字修饰,如下所示:

public virtual string PropertyName { get; set; }

2.2 使用virtual修饰方法

方法可以使用virtual修饰,如下所示:

public virtual void MethodName(){    // 方法体}

2.3 重要说明

  • virtual关键字不能修饰static修饰的成员。
  • virtual关键字可以放在访问修饰符的前面或后面,但一般习惯将其放在后面。
  • 当子类重写父类成员时,必须使用override关键字修饰。
  • overridevirtual的区别在于:
    • virtual用于声明一个可以被重写的成员。
    • override用于重写父类中的成员。
  • 二、虚拟成员的重写与base关键字

    在子类中重写父类的虚拟成员时,通常会使用override修饰,并可以选择是否调用父类的实现。例如:

    class Person{    public virtual void Print()    {        Console.WriteLine("编号:" + Id);        Console.WriteLine("姓名:" + Name);        // 其他输出    }}class Student : Person{    public override void Print()    {        base.Print(); // 调用父类的Print方法        Console.WriteLine("专业:" + Major);        Console.WriteLine("年级:" + Grade);    }}

    三、方法隐藏与重写的区别

    • 方法隐藏:使用new关键字修饰成员,以隐藏父类中的同名成员。
      class A{    public virtual void Print()    {        Console.WriteLine("A");    }}class B : A{    public new void Print()    {        Console.WriteLine("B");    }}
    • 方法重写:使用override关键字修饰成员,以重写父类中的虚拟成员。
      class C : A{    public override void Print()    {        Console.WriteLine("C");    }}

    四、实例说明

    4.1 Student类重写Print方法

    class Student : Person{    public override void Print()    {        Console.WriteLine("专业:" + Major);        Console.WriteLine("年级:" + Grade);    }}

    4.2 Teacher类重写Print方法

    class Teacher : Person{    public override void Print()    {        Console.WriteLine("职称:" + Title);        Console.WriteLine("工资号:" + WageNo);    }}

    4.3 方法隐藏与重写的对比

    class Program{    static void Main(string[] args)    {        A a1 = new B();        a1.Print(); // 输出"A"        A a2 = new C();        a2.Print(); // 输出"C"    }}class A{    public virtual void Print()    {        Console.WriteLine("A");    }}class B : A{    public new void Print()    {        Console.WriteLine("B");    }}class C : A{    public override void Print()    {        Console.WriteLine("C");    }}

    4.4 Student类添加ToString方法

    class Student{    public string Major { get; set; }    public string Grade { get; set; }    public override string ToString()    {        return Major + "," + Grade;    }}

    通过以上内容,可以清晰地理解C#虚拟关键字的使用方法及其在类继承中的应用。

    转载地址:http://lxuk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
    查看>>
    OSM数据如何下载使用(地图数据篇.11)
    查看>>