0

我有接口 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

4 回答 4

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");
       }

    }
于 2013-06-06T09:41:09.197 回答
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");
   }
}
于 2013-06-06T09:44:04.613 回答
0

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

public class SimpleA implements A {

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

  // rest omitted

}

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

于 2013-06-06T09:44:40.257 回答
0

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

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

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

于 2013-06-06T09:41:52.527 回答