我有接口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 */ }
}
答案 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并仅覆盖所需的方法。