通过实现接口,它继承了不需要的方法

时间:2013-06-06 09:39:41

标签: java inheritance interface

我有接口A,它定义了3个应该实现的方法,而B类必须实现所有这三个方法。没问题。 但是在C类中我也在实现接口A,所以我必须为所有三种方法编写实现。但是我的C级不想要doSomthing3()

我只是举一个例子,但我真正的应用程序是一个很大的方法。

假设我有100个实现接口A的子类,现在我希望50个类有另一个新方法可以放在接口A中。但是我必须在所有100个子类中实现它吗? 为什么我要避免继承不需要的方法。

public interface A {

   public void doSomething1();
   public void doSomething2();
   public void doSomething3();

 }

public class B implements A{
   public void doSomething1(){
      System.out.println("doSomething 1");
   }

   public void doSomething2(){
      System.out.println("doSomething 2");
   }

   public void doSomething3(){
      System.out.println("doSomething 3");
   }

}

public class C implements A{

   public void doSomething1(){
      System.out.println("doSomething 1");
   }

   public void doSomething2(){
      System.out.println("doSomething 2");
   }

   public void doSomething3(){ /*Do nothing in this class */  }

}

4 个答案:

答案 0 :(得分:4)

您可以创建两个接口。一个将包含您将在两个类中实现的方法,另一个将包含您希望另一个类的额外方法。然后只需实现正确的类接口。

public interface A {

   public void doSomething1();
   public void doSomething2();

 }

public interface B extends A {

   public void doSomething3();

 }

然后

public class ClassB implements B{
   public void doSomething1(){
      System.out.println("doSomething 1");
   }

   public void doSomething2(){
      System.out.println("doSomething 2");
   }

   public void doSomething3(){
      System.out.println("doSomething 3");
   }

}


public class ClassA implements A{

       public void doSomething1(){
          System.out.println("doSomething 1");
       }

       public void doSomething2(){
          System.out.println("doSomething 2");
       }

    }

答案 1 :(得分:2)

通过引入这样的调用Adapter来解决这个问题:这是一个抽象类,它实现了继承接口的所有方法。在您想要的类中,您只能覆盖所需的方法:

public abstract class AAdapter implements A(){
   public void doSomething1(){
   }

   public void doSomething2(){
   }

   public void doSomething3(){
   }
}

在你班上:

public class C extends AAdapter(){

   @Override
   public void doSomething1(){
      system.out.println("doSomething 1");
   }

   @Override
   public void doSomething2(){
      system.out.println("doSomething 2");
   }
}

答案 2 :(得分:0)

您可以创建一个简单的接口实现,它始终触发NoSuchMethodError或任何其他运行时异常。

然后简单地扩展该类并仅覆盖有用的方法。

或者如另一个答案中所述,您可以考虑重新设计界面。

答案 3 :(得分:0)

您可以考虑创建存根实现:

public class SimpleA implements A {

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

  // rest omitted

}

现在,您的类可以扩展SimpleA并仅覆盖所需的方法。