virtual override new 详解

virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。如果没有此关键字,则不允许在子类中重写此方法。
override 关键字,用于重写父类中的时使用,重写之后则在子类中完全覆盖父类中的方法。
new 关键字,用户重新书写一个与父类中相同的方法,不会覆盖父类中的方法,只会隐藏。
  用两个例子来说明:
例子1:
A a = new B();
    a.Fun();

    public class A
    {
        public A()
        {
            Console.WriteLine("a");
        }
        public virtual void Fun()
        {
            Console.WriteLine("a.fun()");
        }
    }
    
     public class B : A
    {
        public B()
        {
            Console.WriteLine("b");
        }
        public override void Fun()
        {
            Console.WriteLine("b.fun()");
        }
    }
输出:a  b b.fun()

例子2:
A a = new B();
    a.Fun();

    public class A
    {
        public A()
        {
            Console.WriteLine("a");
        }
        public virtual void Fun()
        {
            Console.WriteLine("a.fun()");
        }
    }
    
     public class B : A
    {
        public B()
        {
            Console.WriteLine("b");
        }
        public new void Fun()
        {
            Console.WriteLine("b.fun()");
        }
    }
输出 a  b a.fun();

解释:实例1,方法fun()在B子类中被重载,那么在B子类中就看不到A父类中继承的方法fun(),所以B对象调用的是自己重写的方法;实例2,方法fun()在B子类中被重新写了一遍,相当于一个新方法(只是名字与父类中的方法名字相同而已,但该方法和父类中没有关联),于A父类没有任何联系,而A父类中继承的方法fun()则被隐藏了,把B的对象赋值给A(由于在A类中没有重新写过的方法的定义以及实现,所以在把B对象赋值给A时会去掉某些方法),这时A调用fun()则是调用了继承于父类的方法,只有使用B对象自己调用才会是重写编写过的方法

如果在子类中重载了一个父类的方法,则会发生什么情况了,我们来看个例子:
 public class A
    {
        public A()
        {
            Console.WriteLine("a");
        }
        public virtual void Fun(int i)
        {
            Console.WriteLine("a.fun()" + i.ToString());
        }
    }
    public class B : A
    {
        public B()
        {
            Console.WriteLine("b");
        }
        public override void Fun(int i)
        {
            Console.WriteLine("b.fun()" + i.ToString());
        }
        public void Fun(float s)
        {
            Console.WriteLine("s = " + s.ToString());
        }
    }
在这种情况下,调用B类中的方法Fun(),并传入参数1,则会输出 s = 1,这是因为int型的参数可以转换成float,double,decimal类型,程序就会找B类重写的方法,如果B类重写的方法参数为string类型,则不会出现这种情况,如果需要调用子类重写的父类方法,则使用父类的类名强制转换声明的对象进行调用。

本人第一次写博客,请谅解,如有错误希望能够告知

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值