2015-10-13 26 views
1

当我想定义一个非虚拟方法的新实现时,我可以在C#中使用new关键字,或者在VB中使用shadow关键字。例如:什么是VB的“阴影”或C#“新”关键字相当于Java?

C#代码:

public class Animal 
{ 
    public void MyMethod() 
    { 
     //Do some thing 
    } 
} 

public class Cat : Animal 
{ 
    public new void MyMethod() 
    { 
     //Do some other thing 
    } 
} 

VB代码:

Public Class Animal 
    Public Sub MyMethod() 
     'Do some thing 
    End Sub 
End Class 

Public Class Cat 
    Inherits Animal 

    Public Shadows Sub MyMethod() 
     'Do some other thing 
    End Sub 
End Class 

现在,我的问题是:

什么是VB Shadow(或C#new)关键字相当于Java

+2

请注意,在这种情况下,您不是重写*方法,而是从类层次结构中的此处开始定义新的实现。那不一样。重写具有相当特定的语义,尤其是如何在超类型变量上处理对该方法的调用。并且遮蔽超类型的方法实现具有不同的语义。 – Joey

+0

@Joey我编辑我的问题到新的实现,而不是覆盖关键字。谢谢你的提示。 – Behzad

回答

5

您的问题的主要答案可能是“没有。”。详细信息:

默认情况下,Java的方法是“虚拟的”(使用C#术语)它们可以在子类中被覆盖。原始方法不需要特殊的关键字。定义覆盖时,它是有用的(但不是要求)使用@Override注释,以便编译器会警告您,如果您不认为自己在覆盖,并且读取代码(和JavaDoc)的人知道什么你在做。

例如为:

class Parent { 
    public void method() { 
    } 
} 
class Child extends Parent { 
    @Override 
    public void method() { 
    } 
} 

注意,有在Parentmethod没有特殊的关键字。

如果Java方法标记为final(非虚拟的,C#默认值),则根本无法覆盖它。在这种情况下,没有相当于C#的new。例如:

class Parent { 
    public final void method() { 
    } 
} 
class Child extends Parent { 
    @Override     // <== Won't compile, you simply can't override 
    public void method() {  // <== final methods at all (even if you added 
           // <== "final" to the declaration) 
    } 
}