【发布时间】:2015-03-13 11:47:50
【问题描述】:
我来自 Java 背景,目前正在学习 C#。我刚刚对(我认为的)对象从基类/派生类访问方法的方式的差异感到非常惊讶。这就是我的意思:
如果我做这样的事情,在 Java 中
class InheritanceTesting { public void InheritanceOne() { System.out.println("InheritanceOne"); } } class NewInherit extends InheritanceTesting { public void InheritanceOne() { System.out.println("InheritanceTwo"); } }
然后运行以下命令:
public static void main(String[] args) { InheritanceTesting inh = new NewInherit(); inh.InheritanceOne(); }
我得到了结果:
InheritanceTwo
如果我在 C# 中做同样的事情:
class InheritanceTesting { public void InheritanceOne() { Console.WriteLine("InheritanceOne"); } } class NewInherit : InheritanceTesting { public new void InheritanceOne() { Console.WriteLine("InheritanceTwo"); } }
然后:
InheritanceTesting inh = new NewInherit(); inh.InheritanceOne();
结果是
InheritanceOne
我记得在 Java 中被教导“对象知道它被实例化的类型”,因此,当我调用被覆盖的方法时,这并不奇怪。这是否意味着在 C# 中情况正好相反?对象只“知道”其声明的类型?如果是这样,其中的逻辑/优势是什么?在我看来,Java 将基类视为接口 - 这是您的类型,这是您的实际实现。我是 C# 新手,也许我在这里遗漏了一些明显的东西?
【问题讨论】:
-
由于 Java 不是 C#,我不明白您对它们可能不同的惊讶。其次,我注意到您的 C# 示例在
InheritanceOne签名中似乎有一个new关键字。 -
正如我所提到的 - 我只是在学习:)。到目前为止,我遇到的其他功能非常相似,足以让我对这种差异感到惊讶。 (是的,它有
new关键字,所以它隐藏了基类中的方法。就我在这种情况下理解new而言,它不会影响我的其余问题。再次,正如我所说 -我的问题基本上是“如果我理解这一点,有什么好处”)
标签: java c# inheritance methods