C# virtual,override或者new
2009-03-26 22:51
281 查看
在C#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行.下面的例子可以帮助你来理解:
public class MyBase
{
public virtual string Meth1()
{
return "MyBase-Meth1";
}
public virtual string Meth2()
{
return "MyBase-Meth2";
}
public virtual string Meth3()
{
return "MyBase-Meth3";
}
}
class MyDerived : MyBase
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3() // 系统在这里将会有一个警告,并且将会隐藏方法Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
MyDerived mD = new MyDerived();
MyBase mB = (MyBase) mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
输出:
MyDerived-Meth1
MyBase-Meth2
MyBase-Meth3
可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解
如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:
(把Main()改成:
public static void Main()
{
MyDerived mD = new MyDerived();
System.Console.WriteLine(mD.Meth1());
System.Console.WriteLine(mD.Meth2());
System.Console.WriteLine(mD.Meth3());
}
}
)
MyDerived-Meth1
MyDerived-Meth2
MyDerived-Meth3
这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效
public class MyBase
{
public virtual string Meth1()
{
return "MyBase-Meth1";
}
public virtual string Meth2()
{
return "MyBase-Meth2";
}
public virtual string Meth3()
{
return "MyBase-Meth3";
}
}
class MyDerived : MyBase
{
public override string Meth1()
{
return "MyDerived-Meth1";
}
public new string Meth2()
{
return "MyDerived-Meth2";
}
public string Meth3() // 系统在这里将会有一个警告,并且将会隐藏方法Meth3()
{
return "MyDerived-Meth3";
}
public static void Main()
{
MyDerived mD = new MyDerived();
MyBase mB = (MyBase) mD;
System.Console.WriteLine(mB.Meth1());
System.Console.WriteLine(mB.Meth2());
System.Console.WriteLine(mB.Meth3());
}
}
输出:
MyDerived-Meth1
MyBase-Meth2
MyBase-Meth3
可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解
如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:
(把Main()改成:
public static void Main()
{
MyDerived mD = new MyDerived();
System.Console.WriteLine(mD.Meth1());
System.Console.WriteLine(mD.Meth2());
System.Console.WriteLine(mD.Meth3());
}
}
)
MyDerived-Meth1
MyDerived-Meth2
MyDerived-Meth3
这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效
相关文章推荐
- (教学思路 C#之类八)多态性:base、new、override、virtual
- C#中new、override、virtual关键字的区别
- 浅析C#中new、override、virtual关键字的区别
- C# 虚方法(virtual)覆盖(override) - 隐藏(new) - 重载
- C#中new、override、virtual关键字的区别
- C#继承之base,virtual,override,abstract,new,sealed关键字
- C#virtual override new
- 谈谈C#中的三个关键词new , virtual , override
- 理解c#中的interface abstract virtual override和new(转)
- 【KK学习笔记】c# 虚方法 virtual 、 重写方法 override 、new 的使用与理解
- C#.NET中new, override, virtual abstract关键字的区别
- c#中abstract、override、new、virtual、sealed使用
- 谈谈C#中的三个关键词new , virtual , override(装载 Winner.Net)
- 浅析C#中new、override、virtual关键字的区别
- 浅析C#中new、override、virtual关键字的区别
- C#中new, override, virtual的具体用法
- C# new virtual override 区别
- C# new virtual override 之间的区别
- c#中abstract、override、new、virtual、sealed使用和示例
- (教学思路 C#之类八)多态性:base、new、override、virtual