首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在子类中,为什么不重写任何内容并不是一种很好的方法?

在子类中,为什么不重写任何内容并不是一种很好的方法?
EN

Stack Overflow用户
提问于 2014-03-05 09:33:22
回答 3查看 319关注 0票数 0

我正在阅读“头第一设计模式”,在第一章中,作者试图解释一种设计方法。他首先展示了一个问题,然后尝试使用设计模式来解决它。

假设我有一个Duck基类:

代码语言:javascript
复制
class Duck
{
   swim();
   quack();
   display();
}

以及派生类RubberDuck

代码语言:javascript
复制
class RubberDuck : Duck
{
   quack(); //override to nothing
}

他说,如果RubberDuck不嘎嘎的话,我必须把它重写为零。为什么?

我认为,简单地说,如果RubberDuck不庸俗,我就不会将它添加到RubberDuck中。所以不会有覆盖,就像:

代码语言:javascript
复制
class RubberDuck : Duck
{
   //other methods
}

他说:所以我们知道使用继承的效果不是很好,因为鸭子的行为在子类之间不断变化,而且并不是所有的子类都有这些行为。

为什么?

如果我不覆盖任何方法,我将不会调用在代码中实现子类对象的方法。我的意思是,如果我不使用任何能力,这意味着我没有这种能力,有什么问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-05 09:34:29

如果不重写方法,则该方法将从基类继承。因此,RubberDuck将像Duck一样实现quack

这正是继承的目的。否则,它的用途是什么?

如果您重写一个方法,如果您仍然希望与基类具有相同的行为,则必须调用base.Quack()。不覆盖该方法与以下内容相同:

代码语言:javascript
复制
public void Quack()
{
    base.Quack();
}

因此,重写该方法的唯一原因是更改或扩展它。

聚合的行为可能更符合您的预期,例如:

代码语言:javascript
复制
public interface IDuck
{
    void Quack();
}


public class RubberDuck : IDuck 
{
    private readonly Duck duck = new Duck();

    public void Quack() 
    {
        this.duck.Quack();
    }
}

与:

代码语言:javascript
复制
public class RubberDuck : IDuck 
{  
    public void Quack() 
    {
        // not doing anything, but we still need to implement the method since it's defined by IDuck
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-05 09:38:49

在这本书中,只有display()方法是抽象的,基类为所有其他方法(如quack()swim()等)提供默认实现。

代码语言:javascript
复制
class Duck
{
    swim() {
        // do some swimming
    }

    quack() {
        // do some quacking
    }

    abstract display();
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-05 09:41:42

您应该知道java中没有多重继承,所以如果您从rubbercock扩展另一个子类,并且如果子类quaks,那么它应该在rubbercock中被覆盖,否则子类必须定义一个新的quak方法,但是不能从rubbercock继承/重写它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22193698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档