【问题标题】:By implementing the interface it inherit unwanted methods通过实现接口,它继承了不需要的方法
【发布时间】:2013-09-28 21:19:41
【问题描述】:

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

}

【问题讨论】:

  • 你不是继承接口,你只是遵循实现合同

标签: java inheritance interface


【解决方案1】:

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

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

    }

【讨论】:

    【解决方案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");
       }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        public class SimpleA implements A {
        
          @Override
          public void doSomething1() {
            throw new UnsupportedOperationException();
          }
        
          // rest omitted
        
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-07
          • 2015-08-03
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多