【问题标题】:Abstract methods and hiding methods抽象方法和隐藏方法
【发布时间】:2013-07-12 10:47:54
【问题描述】:

我正在尝试更好地理解 c# 中的抽象类。

我知道在抽象类中,您必须覆盖抽象方法并且可以覆盖虚拟方法..

我的问题是:

我可以覆盖非虚拟方法吗? (我知道通常我不能 - 但也许抽象类会有所不同?)还是会像隐藏一样?

另外,正如我在这里读到的How to force call a C# derived method(第一个答案) - 在我看来,因为非虚拟方法在编译时静态链接并且无法更改 - 我将无法调用派生类,从来没有?如果是这样 - 隐藏方法有什么意义?

【问题讨论】:

标签: c# abstract-class method-hiding


【解决方案1】:

我正在尝试更好地理解 c# 中的抽象类。

好的,那么让我们纠正你的错误,因为你在这里对抽象类有一些完全错误的想法。

我知道在抽象类中,您必须覆盖抽象方法并且可以覆盖虚拟方法。

绝对不是;那句话的第一部分是完全错误的。 在抽象类中没有任何要求重写抽象方法。

非抽象类称为具体类。真正的规则是:

  • 具体类必须用具体方法覆盖其所有抽象基类的所有抽象方法;它可以自己执行此操作,也可以通过其一个或多个基类执行此操作。

这应该是有道理的:在实现每个抽象方法之前,您不能创建具体类的实例;否则你可以调用一个没有实现的方法,那会很糟糕。

  • 任何派生类都可以覆盖其任何基类的非密封虚方法。

我可以覆盖非虚拟方法吗?

没有。您可以重载非虚拟方法,也可以隐藏现有的非虚拟方法,但不能覆盖它们。

在我看来,因为非虚拟方法在编译时静态链接并且无法更改 - 我将无法调用派生类中的方法,永远不会?

当然不是。您通过将接收者转换为派生类来调用派生类的方法。

隐藏方法有什么意义?

复制:

Is method hiding ever a good idea

这是一个你没有问的额外问题。看看你能不能回答。

可以将方法标记为抽象和覆盖吗?如果没有,为什么不呢?如果是,请举一个例子并解释你为什么要这样做。

如果你能正确回答这个问题,那么你可能对抽象方法有很好的理解。解决办法是here

【讨论】:

    【解决方案2】:

    不,你不能。他们必须有虚拟关键字。 Good example here,similarThis one as well

    【讨论】:

      【解决方案3】:

      我建议您仔细研究一下OOP 可以做什么

      关于你的问题,你只能覆盖一个虚拟类,另一个例子而不是隐藏方法是:

      但是,您可以使用 继承 来使用基类中的控件。这应该在两个类相关时完成,以防止创建重复代码。

      一个例子是个人:人类,好吧,所以我们在这里使用 ('type of' :) 来说明一个人是人类的一种。这是继承的基本用法。

      如果它们不相关,则不应这样做,这样做可能看起来更快,但是当您在 3 个月后回顾您的申请时,您会说“我为什么要这样做?”。

      这样的一个例子是,这个基类有一个接近我要找的方法,你需要做一个比较,是真的吗? 我真的应该这样做吗?

      提供的 msdn 文章将为您提供在此方面取得进展所需的信息。享受 OOP

      【讨论】:

        【解决方案4】:

        你有一点误会:

        在抽象类中,您必须覆盖抽象方法并且可以覆盖虚拟方法。

        那句话真的应该是:

        在派生自抽象类的具体类中,您必须覆盖抽象方法并且可以覆盖虚拟方法,无论是在该类本身、其父类之一或其子类之一中。

        您可以使用new 关键字来隐藏或隐藏非虚拟方法,所以是的,它将被隐藏而不是覆盖。

        如果您在子类中隐藏了一个方法,然后想要调用基类中出现的方法,请将子类转换为基类类型,如第二个示例here 中所做的那样。

        【讨论】:

        • 您的改进是一种改进,但还不是很完美。从抽象类派生的类不需要重写抽象方法,因为派生类也可能是抽象的。它只是一个必须为所有抽象方法提供实现的具体派生类。
        • 另外,您也可以使用new 关键字来隐藏虚拟方法。用另一种虚拟方法隐藏一个虚拟方法是罕见的,但完全合法。
        猜你喜欢
        • 1970-01-01
        • 2021-06-02
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 2010-11-13
        • 2021-10-13
        相关资源
        最近更新 更多