【问题标题】:Why to use Overriding? [duplicate]为什么要使用覆盖? [复制]
【发布时间】:2019-05-01 02:47:42
【问题描述】:

在一次采访中被问到为什么我们需要重写基类的方法。 当我们想在派生类中有不同的实现时,我试图回答。 但随后他说,“为什么我们不创建一个具有不同名称和不同实现的新方法,而不是覆盖基类方法?”,无论如何我们不会重用基类方法,因为实现会有所不同,然后只需创建一个新方法而不是覆盖。

我不知道该回答什么。谁能解释一下。

public class BaseClass
{
  virtual void Foo(){}
}

public class DerivedClass: BaseClass
{
   override void Foo(){}
}

通常我们会像上面那样实现覆盖。 他说的是为什么我们需要覆盖的概念,我们可以像下面那样做

public class BaseClass
{
  void Foo(){}
}

public class DerivedClass: BaseClass
{
   void Foo1(){}
}

我试图解释他的问题看起来很奇怪,但就像它是基类的方法一样,我们只是在派生类中重新定义它。这样我们的代码也将是干净的。但看起来他并不满意。

【问题讨论】:

  • 考虑:Animal a = new Dog(); Animal b = new Cat(); a.Speak(); b.Speak(); - 它与Dog a = new Dog(); Cat a = new Cat(); a.Speak(); b.Speak(); 有何不同?
  • 您要更改“基本”功能还是实现新功能?重写方法回到多态性的基础,然后您可以将“新”类的实例传递给需要“旧”实例的方法,它们将能够与它提供的新功能进行交互
  • 我强烈怀疑 Foo1 应该是 Foo 以显示 shadowing 与虚拟方法...到目前为止,这篇文章太宽泛了 - 希望它有所涵盖我选择了 3 个重复项。

标签: c# .net oop


【解决方案1】:

我会检查这个答案: Why does this polymorphic C# code print what it does?

然后尝试掌握对象中方法的概念,该对象基本上具有指向代码的指针。当您在子类中 override 实现时,它将成为指向的新代码,无论它是否被用作超类。

因此,重写的主要目的是创建从一个类继承但每个类都有自己的实现的类,然后能够像原始超类一样对待或操作它们。这是 Liskov 原则或 SOLID 中的“L”的本质。 What is an example of the Liskov Substitution Principle?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2010-09-23
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多