C#中隐藏(new)和方法重载(overide)的区别
时间:2011-05-23 来源:戒色
重写和隐藏的定义:
重写:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
隐藏:基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。
这样看起来似乎不是很清晰明了,换成我自己的理解就是:
比如父类A,有个方法标记为virtual,a(){}
子类B继承A,也声明一个方法a(){}
如果B里面的a()使用override,那么访问A的方法时实际上调用了B里面声明的方法,相当于A的方法被覆盖了,new就不是,访问A的a还是A里面定义的方法,访问B就是B里面定义的方法. 说白了:new是覆盖,override是重载,“覆盖”并不意味着“删除”,但“重载”意味着“删除”,这就是“覆盖”和“重载”的区别 隐藏(new)示例: using System;
class A
{
public void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
new public void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main(string[] args)
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出为
B.F
A.F 重写virtual(虚方法)示例
using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出为
B.F
B.F
子类B继承A,也声明一个方法a(){}
如果B里面的a()使用override,那么访问A的方法时实际上调用了B里面声明的方法,相当于A的方法被覆盖了,new就不是,访问A的a还是A里面定义的方法,访问B就是B里面定义的方法. 说白了:new是覆盖,override是重载,“覆盖”并不意味着“删除”,但“重载”意味着“删除”,这就是“覆盖”和“重载”的区别 隐藏(new)示例: using System;
class A
{
public void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
new public void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main(string[] args)
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出为
B.F
A.F 重写virtual(虚方法)示例
using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
class B: A
{
public override void F()
{
Console.WriteLine("B.F");
}
}
class Test
{
static void Main()
{
B b = new B();
b.F();
A a = b;
a.F();
}
}
输出为
B.F
B.F
相关阅读 更多 +