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![]()
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![]()
运行结果如下:分为几种情况
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace Messages6
{7
public class Thought8
{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 : Thought21
{22
//public void SendMessage()//警告:这种写法编译器会报警告,说有意隐藏方法请使用new23
//public override void SendMessage()//错误:方法未标记未virtual或者abstract24
//private new void SendMessage()//合法:这种写法不报错也没有警告25
public new void SendMessage()26
{27
Console.Out.WriteLine("Advice.SendMessage");28
}29
//public void ReceiveMessage()//警告:要使当前成员重写该实现请添加override关键字,否则添加关键字new30
//private override void ReceiveMessage()//错误:虚拟成员或抽象成员不能是私有的 31
//protected override void ReceiveMessage()//错误:当重写“public”继承成员无法更改访问修饰符32
//public new override void ReceiveMessage()//错误:标记为 override 的成员不能标记为 new 或 virtual33
//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 Message42
{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();//virtual50
Console.Out.WriteLine("***************************");51
badvice.SendMessage();52
badvice.ReceiveMessage();//virtual53
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();//virtual64
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
//改变访问修饰符改为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
//改变访问修饰符改为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
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
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



浙公网安备 33010602011771号