3

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

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

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

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

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

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

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

4

4 回答 4

2

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

你唯一能做的就是不改变 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 
}

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

于 2013-08-27T13:09:11.480 回答
0

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

void swim() throws CanNotSwimException{
}
于 2013-08-27T12:17:05.537 回答
0

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

于 2013-08-27T12:19:27.687 回答
-1

根据情况,您也可以将方法留空(如果是)void

于 2013-08-27T12:20:45.490 回答