new和Virtual的区别

new是给子类新增加了一个函数,可以说除了函数名字相同以外,它跟基类里面的这个同名函数没有任何关系。当使用子类的类型来调用的时候,它会运行子类中的函数。而如果类型是基类的话,被隐藏的基类函数就会站到前台来。
只有使用virtual定义基类中的函数,并使用override标记子类中的函数,才可以达到想要的多态类。
(派生类的对象只有在被父类重塑的时候,override和new关键字才会生效)
注意
1.虚拟成员或者抽象成员不能是私有的,可以用其它的访问修饰符,而且当要override虚方法或者抽象方法时,方法的访问修饰符应该保持一致不能改变
2.如果父类中的是一般的方法那么在子类中不能用override重写(不然会报错),如果想要重写只能用new关键字
(如果什么也不加编译器会有警告,告诉你如果有意要隐藏方法请使用new)
看如下的代码示例:
 1 using  System;
 2 using  System.Collections.Generic;
 3 using  System.Text;
 4
 5 namespace  Messages
 6 {
 7      public class Thought
 8    {
 9        public void SendMessage()
10        {
11            Console.Out.WriteLine("Thought.SendMessage");
12        }

13        //private virtual void ReceiveMessage()//错误:虚拟成员或者抽象成员不能是私有的
14        public virtual void ReceiveMessage()
15        {
16            Console.Out.WriteLine("Thought.ReceiveMessage");
17        }

18
19    }

20    public class Advice : Thought
21    {
22        //public void SendMessage()//警告:这种写法编译器会报警告,说有意隐藏方法请使用new
23        //public override void SendMessage()//错误:方法未标记未virtual或者abstract
24        //private new void SendMessage()//合法:这种写法不报错也没有警告
25        public new void SendMessage()
26        {
27             Console.Out.WriteLine("Advice.SendMessage");
28        }

29        //public void ReceiveMessage()//警告:要使当前成员重写该实现请添加override关键字,否则添加关键字new
30        //private override void ReceiveMessage()//错误:虚拟成员或抽象成员不能是私有的    
31        //protected override void ReceiveMessage()//错误:当重写“public”继承成员无法更改访问修饰符
32        //public new override void ReceiveMessage()//错误:标记为 override 的成员不能标记为 new 或 virtual
33        //public new void ReceiveMessage()//合法
34        public override void ReceiveMessage()//合法:这种写法.net环境会智能感应出方法名称而且还会在方法体中自动添加base.ReceiveMessage();
35
36        {
37            Console.Out.WriteLine("Advice.ReceiveMessage");
38            //base.ReceiveMessage();//用 public override void ReceiveMessage()自动添加的(但是如果添加这个语句此方法总是会调用父类中的方法,如果不行执行父类的方法可以去掉语句)
39        }

40    }

41    class Message
42    {
43        static void Main(string[] args)
44        {
45            Thought athough = new Thought();
46            Advice  badvice = new Advice();
47            Thought c = new Advice();
48            athough.SendMessage();
49            athough.ReceiveMessage();//virtual
50            Console.Out.WriteLine("***************************");
51            badvice.SendMessage();
52            badvice.ReceiveMessage();//virtual
53            Console.Out.WriteLine("***************************");
54            c.SendMessage();
55            c.ReceiveMessage();
56            Console.Out.WriteLine("***************************");
57            (c as Advice).SendMessage();
58            (c as Advice).ReceiveMessage();
59            Console.Out.WriteLine("***************************");
60            //Advice aadvice = (Advice)athough;//错误:此处由父类到子类的强制转换会报错
61            Thought bthought = (Thought)badvice;
62            bthought.SendMessage();
63            bthought.ReceiveMessage();//virtual
64            Console.In.ReadLine();
65        }

66    }

67}

68
运行结果如下:分为几种情况
1:
  public   class  Advice : Thought
    
{
       
public new void SendMessage();//(public void SendMessage()//警告:这种写法编译器会报警告,说有意隐藏方法请使用new)
        public override void ReceiveMessage();
    }

运行结果是:
Thought.SendMessage
Thought.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
2:
// 改变访问修饰符改为Protected或者Private
   public   class  Advice : Thought
    
{
        Protected 
new void SendMessage();
        
public override void ReceiveMessage();
    }

运行结果是:
Thought.SendMessage
Thought.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
3:
// 改变访问修饰符改为Internal 或者Protected Internal 
public   class  Advice : Thought
    
{
        Protected Internal 
new void SendMessage();
        
public override void ReceiveMessage();
    }

运行结果如下
Thought.SendMessage
Thought.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
4:
public   class  Advice : Thought
    
{
        Protected Internal 
new void SendMessage();
        
public void ReceiveMessage()//警告:要使当前成员重写该实现请添加override关键字,否则添加关键字new
    }
运行结果是:
Thought.SendMessage
Thought.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
5:
public   class  Advice : Thought
    
{
        Protected Internal 
new void SendMessage();
        
public new void ReceiveMessage()//合法
    }
运行结果是
Thought.SendMessage
Thought.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage
***************************
Advice.SendMessage
Advice.ReceiveMessage
***************************
Thought.SendMessage
Advice.ReceiveMessage

转载于:https://www.cnblogs.com/burandanxin/archive/2007/12/18/1005159.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值