侧边栏壁纸
博主头像
Komi博主等级

WizMan Komi

  • 累计撰写 30 篇文章
  • 累计创建 43 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

60行代码搞懂C#中的virtual关键字的定义与使用方法

Komi
2022-09-17 / 0 评论 / 1 点赞 / 57 阅读 / 1,764 字
温馨提示:
内容仅供参考,实际使用需根据自身条件进行调整与删改

virtual关键字?

virtual关键字能够为一个类提供虚方法,而虚方法牵扯到了OOP中的继承关系,直白来说,父类为子类生成了一个默认的实现方法,子类若需要重写该方法则需要实现override

代码一览

public class Bench01
{
    public static void Main(string[] args)
    {
        BenchMark01 b1 = new BenchMark01();
        BenchMark02 b2 = new BenchMark02();
        BenchMark03 b3 = new BenchMark03();
        BenchArc b4 = new BenchMark03();
        BenchMark04 b04 = new BenchMark04();
        BenchMark05 b05 = new BenchMark05();
        b1.vd1();
        b2.vd1();
        b3.vd1();
        b4.vd1();
        b04.vd1();
        b05.vd1();
    }

    private class BenchArc
    {
        private const int times = 2;

        public virtual void vd1(string param = "default string here")
        {
            foreach (var i in Enumerable.Range(0, times))
            {
                Console.WriteLine(i + param);
            }
        }
    }

    private class BenchMark01 : BenchArc
    {
    }

    private class BenchMark02 : BenchArc
    {
        public override void vd1(string param = "default string here")
        {
            Console.WriteLine("new branch here");
        }
    }

    private class BenchMark03 : BenchArc
    {
        public new void vd1(string param = "")
        {
            Console.WriteLine("BenchMark number is 3");
        }
    }

    private class BenchMark04 : BenchMark03
    {
    }

    private class BenchMark05 : BenchMark02
    {
    }
}

代码解读

  1. BenchArc类: 作为所有子类的基类(父类) 类中提供了一个虚方法
  2. BenchMark01类: 继承自BenchArc类,没有实现任何方法
  3. BenchMark02类: 继承自BenchArc类,重写了vd1方法
  4. BenchMark03类: 同样继承自BenchArc类,但是使用了自己的vd1方法而不是继承自BenchArc的
  5. BenchMark04类: 继承自BenchMark03类,没有实现任何方法
  6. BenchMark05类: 继承自BenchMark02类,没有实现任何方法

结果如下:

/**
* 0default string here
* 1default string here
* new branch here
* BenchMark number is 3
* 0default string here
* 1default string here
* BenchMark number is 3
* new branch here
*/

结果解读

  • b1.vd1() -> 使用基类的虚方法 也就是默认的实现方法
  • b2.vd1() -> 重写了积累的方法 使用的是自己实现的方法
  • b3.vd1() -> 虽说是继承自了BenchArc类,但是用的是自己new出来的方法,所以返回的是自己方法的输出
  • b4.vd1() -> 定义为了BenchArc类的实现,所以这里查找的是基于BenchArc类的默认vd1方法
  • b04.vd1() -> 继承自BenchMark03类,而BenchMark03继承自BenchArc类,但是vd1的方法是属于BenchMark03的,顾返回的是BenchMark03的实现输出
  • b05.vd1() -> 继承自BenchMark02类,虽说BenchMark02重写实现了BenchArc的vd1方法,但是方法是基于BenchArc的,顾返回BenchArc的默认vd1实现输出

最后

picd1.png

一个类中不能同时存在同一个方法的重写和显示隐藏,否则编译无法通过!

1

评论区