【问题标题】:How I can skip one method in a class extending Abstract Class?如何在扩展抽象类的类中跳过一个方法?
【发布时间】:2013-08-27 12:14:24
【问题描述】:

我有一个名为 Animal 的抽象类,它有大约 100 个方法,包括 swim

Dog、Cat、Lion 等许多类都在扩展该类。

现在有一种动物长颈鹿不会游泳。但它正在扩展Animal 抽象类。

我希望长颈鹿对象没有swim 方法。

Giraffe g = new Giraffe();
//g.swim();  // This swim should not come.

我无法更改 Animal Class。 一种解决方案是再创建一个抽象类,复制除游泳之外的所有方法。 但这不是一个好方法。

如何使用 Animal 抽象类来做到这一点? 预先感谢。

【问题讨论】:

  • 为什么不使用 Swimable、Barkable 等接口并实现它。
  • 问题是你在Animal 的设计很糟糕,因为你说动物会游泳……长颈鹿是动物,不会游泳……

标签: java inheritance abstract-class


【解决方案1】:

您不能通过合同产生 java 指南。如果你说Animal 可以游泳,那么所有动物都可以游泳,包括长颈鹿,如果不是,那么长颈鹿就不是动物。

你唯一能做的就是不改变动物

@Override
public void swim(){
 throw new UnsupportedOperationException();
}

你可以做的另一件事是制作另一个课程

public class Giraffe {

private final Animal a;

public Giraffe(Animal a){
  this.a=a;
}

public void method1(){
  a.method1();
}

public Something drink(){
  return a.drink();
}
.
.
.
// and not implementing swim 
}

另一个是为Animal创建一个没有swim()方法的超级接口并让Animal实现它。

【讨论】:

    【解决方案2】:

    您不能跳过swim() 的定义。但是,您可以针对此类情况抛出异常。

    void swim() throws CanNotSwimException{
    }
    

    【讨论】:

    • @OP 这可能不是您想要的方式,但绝对没有错或离题。
    【解决方案3】:

    在我看来,最优雅的解决方案是重写该方法,并抛出一个 OperationNotSupportedException

    【讨论】:

      【解决方案4】:

      视情况而定,如果是void,也可以将方法留空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        相关资源
        最近更新 更多