虚拟和新的用法

时间:2011-07-24 08:19:48

标签: c# .net inheritance virtual new-operator

据我在c#中看到,

虚函数不仅仅适用于多态,

它也用于覆盖编译器隐藏方法警告

我是对的吗?

我举一个例子:

class A
{
   public void func(int a)
     {
        ....
     }
}
class B:A
{
   public void func(int a)
     {
        ....
     }
}

现在,我正在使用B x = new B(); 所以编译器会警告我B类中的方法隐藏了A中的方法。 所以有2个解决方案:

1)使用New关键字

标记B中的那个

2)制作'A' virtual中的那个和B - Overriding中的那个 - 这将清除隐藏的警告..

唯一的区别在于多态 A x = new B();

如果B类中有'new' - 如果我正在使用virtual那么新的一个将被调用机制 - 来自B的那个将被调用。

所以虚拟在.net中有2个角色:(如果我错了,请正确我)

1)解决隐藏警告(在非多态环境中)

2)当然会覆盖是 - 多态环境中的功能。

如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:4)

不,虚拟方法 是多态的。你的“解决方案”#2将改变调用x.func()从调用A实现到调用B实现的行为 - 即使其变为多态。是的,它删除了警告 - 但它不再是“非多态性环境”,因为你已经使行为具有多态性。你想要那样做吗?如果您这样做,那么virtualoverride就是您的选择。如果没有,则应使用new或重命名方法。

我会强烈建议你避免使用方法隐藏,除非你真的需要。你甚至需要B来自A吗?如果你想给它另一个具有相同名称但含义不同的方法,可以考虑将它们作为单独的类。就个人而言,除非有明显的多态关系,否则我会避开继承。

(请注意,顺便说一下,覆盖和重载是不同的概念。你的意思是覆盖在这里。)

答案 1 :(得分:0)

编译器警告就是这样。这是一个警告,你的func()的实现可能不正确,因为它隐藏了基类的成员。

它的作用是删除警告,但这不是它的原因。 原因是让您仔细检查并确认您的意图。

答案 2 :(得分:0)

基本上“新”关键字用于克服隐藏方法的警告。 虚拟关键字纯粹是为了多态,它告诉编译器是否覆盖了可用方法的版本然后运行该方法其他方面运行虚方法。

虚拟覆盖也称为运行时多态。因为它决定运行时将运行什么方法。

虽然“New”关键字删除了警告并且只运行子类方法并隐藏了父方法,所以为了解决这个问题我们使用:

   public new void Method()
{
//Some code
Base.Method();

}

通过使用它我们运行父方法并取消隐藏父类方法