C# override、new、abstract 与virtual详解

要理解面向对象,就得理解多态,多态确实难理解,工作了两年了,才理解一点点。

下面就C#中的几个易搞错的关键字和各位网友一分享下,请看如下代码:

static void Main(string[] args)
        {
            root obj1 = new node1();
            obj1.run();
            root obj2 = new node2();
            obj2.run();

            System.Console.WriteLine("----------------------");
            root obj3 = new node1();
            obj3.RunBase();
            root obj4 = new node2();
            obj4.RunBase();

            System.Console.WriteLine("----------------------");
            root obj5 = new node1();
            obj5.AbRun();
            root obj6 = new node2();
            obj6.AbRun();

            System.Console.WriteLine("----------------------");
            node1 obj11 = new node1();
            obj11.run();
            node2 obj12 = new node2();
            obj12.run();

            System.Console.WriteLine("----------------------");
            node1 obj13 = new node1();
            obj13.RunBase();
            node2 obj14 = new node2();
            obj14.RunBase();

            System.Console.WriteLine("----------------------");
            node1 obj15 = new node1();
            obj15.AbRun();
            node2 obj16 = new node2();
            obj16.AbRun();
        }
    }
    public abstract  class root
    {
        public root()
        {
        }
        public virtual void run()
        {
            System.Console.WriteLine("这是基类中的方法");
        }
        public abstract void AbRun();
        public virtual void RunBase()
        {
            System.Console.WriteLine("调用了基类的RunBase方法");
        }
    }
    public class node1 : root
    {
        public node1()
        {
        }
        public override void run()
        {
            System.Console.WriteLine("这是子类1中的方法");
        }
        public override void RunBase()
        {
            base.RunBase();
            System.Console.WriteLine("调用了子类1中的Runbase方法");
        }
        public override void AbRun()
        {
            System.Console.WriteLine("调用了子类1中的AbRun方法");
        }
    }
    public class node2:root
    {
        public node2()
        {
        }
        public new void run()
        {
            System.Console.WriteLine("这是子类2中的方法");
        }
        public new void RunBase()
        {
            base.RunBase();
            System.Console.WriteLine("调用了子类1中的Runbase方法");
        }
        public override void AbRun()
        {
            System.Console.WriteLine("调用了子类2中的AbRun方法");
        }
    }

 

运行结果如下

 

 

 

这是子类1中的方法
这是基类中的方法
----------------------
调用了基类的RunBase方法
调用了子类1中的Runbase方法
调用了基类的RunBase方法
----------------------
调用了子类1中的AbRun方法
调用了子类2中的AbRun方法
----------------------
这是子类1中的方法
这是子类2中的方法
----------------------
调用了基类的RunBase方法
调用了子类1中的Runbase方法
调用了基类的RunBase方法
调用了子类1中的Runbase方法
----------------------
调用了子类1中的AbRun方法
调用了子类2中的AbRun方法
请按任意键继续. . .

 

 解释如下

1: Override     主要用来对基类的抽象方法和虚方法进行重写,方法必须是virtual abstract  override修释的才可以重写

      New           关键字主要用来定义一个与基类同名的方法,区别派生类和基类同名方法的选择问题,通过隐藏基类方法,到使编译器调用正确的方法的目的. 

2:   abstract方法只能被override  不能被new,并且在子类中必须被重写

3:  virtual方法可以override又可以new,子类中可以重写,也可以隐藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值