Java:在类中覆盖不需要的方法 - 更新

时间:2015-04-15 22:00:18

标签: java interface override abstract-class multiple-inheritance

在我的项目中,我有一个包含几个抽象方法的抽象类。现在有多个其他类扩展了该抽象类。并非所有类都希望覆盖抽象类的所有方法,因为这对它们没用。如何在对类无用的子类中提供这些方法的默认实现? 实施例 - :

public abstract class Animal
{
    public void Action()
    {
     .....
     this.roar();
    } 

    public abstract void roar();

    public abstract void run();
}

上面是抽象类,它将具有子类将实现的抽象方法。

public class Lion extends Animal
{
   @Override
   public void roar()
   {
      s.o.p("Lion roars");
   }

   @Override
   public void run()
   {
      s.o.p("Lion runs");
   }
}

public class Deer extends Animal
{
   @Override
   public void roar()
   {
      // Question : What should I do here?
   }

   @Override
   public void run()
   {
      s.o.p("Deer runs");
   }
}

编辑 - :

感谢您的建议,我理解另一个类可以拥有不常见的方法(在这种情况下是“咆哮”)的想法。但是我的项目结构有点不同,它的遗留代码有很多子类从Animal类扩展而来。子类调用一个具体的方法,该方法又调用抽象方法(在本例中为“咆哮”,请参见具体方法“Action”的更新的Animal类)。 现在你建议我是否创建了另一个抽象类

public abstract RoaringAnimal extends Animal
{
    public abstract void roar();
}

这将解决其中一个问题,因为我现在只能扩展RoaringAnimal而不是Animal,但是其他类调用Animal.Action方法,他们不会在Animal和javac中找到实现roar()会抱怨。

4 个答案:

答案 0 :(得分:3)

如果你有一个适合子类但不适合超类的方法,比如这里的roar方法,那么你可能想要提供另一个子类Animal的抽象类,但提供{{ 1}},比方说,roarRoaringAnimal方法将不再在roar()中声明,而是在Animal中声明。

RoaringAnimal

然后,您可以public abstract class RoaringAnimal extends Animal { public abstract void roar(); } 展开Deer,而不是Animal,但您可以roar()展开Lion,实施RoaringAnimal

答案 1 :(得分:1)

传统上你这样做:

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

此异常是为此实际创建的

@rgettman答案虽然更合适!尽量不要使用这种方法;)但是要知道它存在,你可以在核心Java库中找到一些例子

答案 2 :(得分:0)

一种常见的解决方案是称为适配器类的类。这些将使用标准(或空)实现实现所有方法,并覆盖您想要更改的方法。不利的一面是,你不知道动物是否可以做到这一点。

另一种可能性是将抽象类拆分为接口。通常组合在一起的每组方法都放在一个界面中。然后,该类将实现或不实现接口。这最终可以为你的动物提供特征界面(咆哮,跑步,爬行......),然后动物实现将实现它可以实现的接口。接口之间的依赖关系可以通过接口继承来构建。

在Java8上,可以使用接口的默认方法,也可以用于您的类。您可以使用具有默认方法的接口,而不是使用抽象基类。

答案 3 :(得分:0)

在这种情况下,请使用Adapter类。适配器类将是扩展抽象类的具体类,但它基本上实现其方法没有任何东西或其方法实现可以抛出一个扩展RuntimeException的异常。 / p>

在Awt中有一个非常好的例子,带有MouseAdapter类。 See the javadoc here

以下是一个例子:

class AnimalAdapter extends Animal {

    @Override
    public void roar() {

        throw new NotImplementedException();

    }

    @Override
    public void run() {


    }

}

示例的Sheep类将扩展AnimalAdapter,但只有在尝试调用roar时才会获得RuntimeException。

class Sheep extends AnimalAdapter {

    @Override
    public void run() {
        System.out.println("I am a sheep I run, but I don't roar...");
    }

}

这样的例外的例子

class NotImplementedException extends RuntimeException {

}