virtual override new


public
class Father { public void Say() { Console.WriteLine("I am Father"); } } public class Son : Father { public void Say() { Console.WriteLine("I am Son"); } } class Program { static void Main(string[] args) { Father f = new Father(); Father s = new Son(); Son so = new Son(); f.Say(); s.Say(); so.Say(); Console.Read(); } }

 

 

 public class Father
    {
        public void Say()
        {
            Console.WriteLine("I am Father");
        }
    }
    public class Son : Father
    {
        public new void Say()
        {
            Console.WriteLine("I am Son");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Father f = new Father();
            Father s = new Son();
            Son so = new Son();
            f.Say();
            s.Say();
            so.Say();
            Console.Read();
        }
    }

没有警告了

 

 

 public class Father
    {
        public void Say()
        {
            Console.WriteLine("I am Father");
        }
    }
    public class Son : Father
    {
        public override void Say()
        {
            Console.WriteLine("I am Son");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Father f = new Father();
            Father s = new Son();
            Son so = new Son();
            f.Say();
            s.Say();
            so.Say();
            Console.Read();
        }
    }

 

public class Father
    {
        public virtual void Say()
        {
            Console.WriteLine("I am Father");
        }
    }
    public class Son : Father
    {
        public void Say()
        {
            Console.WriteLine("I am Son");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Father f = new Father();
            Father s = new Son();
            Son so = new Son();
            f.Say();
            s.Say();
            so.Say();
            Console.Read();
        }
    }

 public class Father
    {
        public virtual void Say()
        {
            Console.WriteLine("I am Father");
        }
    }
    public class Son : Father
    {
        public new void Say()
        {
            Console.WriteLine("I am Son");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Father f = new Father();
            Father s = new Son();
            Son so = new Son();
            f.Say();
            s.Say();
            so.Say();
            Console.Read();
        }
    }

没有警告了

 public class Father
    {
        public virtual void Say()
        {
            Console.WriteLine("I am Father");
        }
    }
    public class Son : Father
    {
        public override void Say()
        {
            Console.WriteLine("I am Son");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Father f = new Father();
            Father s = new Son();
            Son so = new Son();
            f.Say();
            s.Say();
            so.Say();
            Console.Read();
        }
    }

总结:        

virtual

new

override

 override不能单独使用,要和virtual一起使用。

对于非虚的方法,CLR运行的时候并不会进行类型检查,而是直接运行该引用的类型中所定义的方法,即使这个引用所指向的实际类型是该引用类型的派生类,并且在派生类中存在着同名同参的方法,也不会运行派生类中定义的方法。

但是如果在基类中显示声明方法为虚方法,那么CLR在运行的时候会进行类型检查,如果发现引用类型和实际的对象类型不一致,就会检查派生类中是否覆盖(override)了基类中的方法,如果是,则会运行派生类中的方法,而不是引用类型中的方法。

http://blog.csdn.net/zhoufoxcn/article/details/2864429

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值