new和Virtual的区别
new是给子类新增加了一个函数,可以说除了函数名字相同以外,它跟基类里面的这个同名函数没有任何关系。当使用子类的类型来调用的时候,它会运行子类中的函数。而如果类型是基类的话,被隐藏的基类函数就会站到前台来。
只有使用virtual定义基类中的函数,并使用override标记子类中的函数,才可以达到想要的多态类。
(派生类的对象只有在被父类重塑的时候,override和new关键字才会生效)
注意:
1.虚拟成员或者抽象成员不能是私有的,可以用其它的访问修饰符,而且当要override虚方法或者抽象方法时,方法的访问修饰符应该保持一致不能改变
2.如果父类中的是一般的方法那么在子类中不能用override重写(不然会报错),如果想要重写只能用new关键字
(如果什么也不加编译器会有警告,告诉你如果有意要隐藏方法请使用new)
看如下的代码示例:
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
只有使用virtual定义基类中的函数,并使用override标记子类中的函数,才可以达到想要的多态类。
(派生类的对象只有在被父类重塑的时候,override和new关键字才会生效)
注意:
1.虚拟成员或者抽象成员不能是私有的,可以用其它的访问修饰符,而且当要override虚方法或者抽象方法时,方法的访问修饰符应该保持一致不能改变
2.如果父类中的是一般的方法那么在子类中不能用override重写(不然会报错),如果想要重写只能用new关键字
(如果什么也不加编译器会有警告,告诉你如果有意要隐藏方法请使用new)
看如下的代码示例:
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![](/Images/OutliningIndicators/None.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/InBlock.gif)
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![](/Images/OutliningIndicators/None.gif)
运行结果如下:分为几种情况![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
68
![](/Images/OutliningIndicators/None.gif)
1:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
运行结果是:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)