【问题标题】:Inheritance and Overriding. How it differs in C#?继承和覆盖。在 C# 中有什么不同?
【发布时间】:2018-05-09 22:26:19
【问题描述】:

有一件事我需要清楚。使用继承时,我可以在不使用任何 virtual 或 override 关键字的情况下覆盖方法。我的程序也在运行并给出正确的输出。那为什么我们有覆盖的概念,即使我们有继承。有什么不同?

这是我的代码

class InheritanceDemo
{
public void Mymeth()
{
Console.WriteLine("this is base");
}
}

class A1 : InheritanceDemo
{

public void Mymeth()
{

Console.WriteLine("this is derived");
}
}

主要方法:

static void Main(string[] args)
{

InheritanceDemo a = new A1();
A1 b = new A1();
a.Mymeth();
b.Mymeth();

}

输出:

这是基础

这是派生的

【问题讨论】:

  • b 声明为InheritanceDemo 而不是A1 (InheritanceDemo b = new A1();),你会明白的。

标签: c# inheritance virtual overriding


【解决方案1】:

当派生类函数必须比基类函数完成更多或不同的工作时,需要函数覆盖。

这些概念在问题很大的大规模应用中变得很重要,因此,您首先创建一个抽象类(它只是给出关于事物可能如何而不是直接实现的想法)。这些抽象类可以包含任何工作组成员必须实现的虚拟方法(成员函数)(因为必须在派生类中定义虚拟方法)。 我想你明白我的意思... :)

【讨论】:

    【解决方案2】:

    为什么你认为输出是“正确的”?通过继承,您希望调用正确的 inherited 函数,而 不是 基类中的方法。这就是您使用虚拟/覆盖定义的内容。

    【讨论】:

    • 是的,我明白了。谢谢!
    【解决方案3】:

    当你编译这个时,你应该得到一个警告CS0108

    不要忽略警告。实际上,如果您可以将编译设置为错误而不是警告。警告通常表明你做了坏事,或者充其量是不清楚的。它们不是错误,因为您可能有充分的理由做一些乍看之下看起来很糟糕或不清楚的事情,但在隐藏而不是覆盖的情况下,我们有 new

    您在此处拥有的不是覆盖,尽管正如您所期望的那样,通常您在此处想要的是覆盖。这就是这段代码产生编译器警告的部分原因。

    我的程序也在运行并给出正确的输出

    也许它是正确的,但如果你期望覆盖它是不正确的。如果它是压倒一切的,那么两者都应该有“这是派生的”输出。

    如果它是正确的,那就是一个糟糕的设计,因为人们通常期望覆盖。您可以通过将 A1.Mymeth 更改为定义为 public new void Mymeth() 来停止警告,这是一种标记“我真的打算做这件看起来不对的事情”的方法,但如果您必须解释自己,这是一个不好的迹象。隐藏方法通常仅在有人更改您手下的基类时才进行,由于某种互操作性和少数其他非常罕见的情况,您需要匹配名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2011-02-05
      • 1970-01-01
      • 2017-06-02
      • 2018-07-26
      • 2011-08-10
      相关资源
      最近更新 更多