【问题标题】:not implementing all of the methods of interface. is it possible?没有实现接口的所有方法。可能吗?
【发布时间】:2012-07-11 08:00:03
【问题描述】:

有没有办法在继承类中实现接口的所有方法?

【问题讨论】:

标签: java interface abstract-class


【解决方案1】:

解决此问题的唯一方法是将您的类声明为abstract,并将其留给子类来实现缺失的方法。但最终,链中的某个人必须实现它以满足接口契约。如果您确实不需要特定的方法,您可以实现它,然后return 或抛出一些NotImplementedException,以更适合您的情况。

接口还可以将一些方法指定为“默认”,并在接口定义中提供相应的方法实现 (https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html)。在实现接口时无需提及这些“默认”方法。

【讨论】:

  • 我有一个后续问题。我一直只实现Comparator接口的compare()函数,使用Arrays.sort()对对象进行排序。但是现在我打开Javadoc,我看到那里定义了更多的方法。那么,我是如何做到这一点的呢?
  • @JohnRed 再看看那个 Javadoc。除了“比较”和“等于”之外,每个方法都标记为staticdefault。 “等于”的文档还提到“请注意,不要覆盖 Object.equals(Object) 总是安全的。”
  • @TinWizard 它是“安全的”吗 - 不会引发编译时错误 - 不覆盖 Comparator 合约或类(实现 Comparator)隐式继承自 Object 的 equals ,因此equal 方法实现已经“隐式”存在?
【解决方案2】:

接口的意义在于保证一个对象的外在行为就像接口指定的那样

如果您没有实现接口的所有方法,那么您会破坏接口的全部用途。

【讨论】:

  • 清晰易懂
【解决方案3】:

我们可以覆盖abstract父类中的所有接口方法,而子类中仅覆盖该特定子类所需的那些方法。

界面

public interface MyInterface{
    void method1();
    void method2();
    void method3();
}

抽象父类

public abstract class Parent implements MyInterface{
@Override
public void method1(){

}
@Override
public void method2(){

}
@Override
public void method3(){

}
}

在您的子类中

public class Child1 extends Parent{
    @Override
    public void method1(){

    }
}




public class Child2 extends Parent{
    @Override
    public void method2(){

    }
}

【讨论】:

    【解决方案4】:

    我问过自己同样的问题,然后了解了适配器。它解决了我的问题,也许它可以解决你的问题。这很好地解释了它:https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters

    【讨论】:

      【解决方案5】:

      将该类定义为abstract 类。但是,当您想要创建它的实例时(通过使用子类或匿名类),您必须实现那些未实现的方法。

      【讨论】:

        【解决方案6】:

        这是可能的,而且很容易。我编码了一个example

        您所要做的就是从实现该方法的类继承。如果你不介意一个不可实例化的类,那么你也可以定义一个abstract 类。

        【讨论】:

        • 这意味着它们已经实现了。
        • @TonyHopkinson 都实现了,但不在课堂上。
        • 嗯,是的,但问题是如何不实施而不是如何在其他地方实施。
        【解决方案7】:

        你可以在 Java8 中做到这一点。 Java 8 引入了“默认方法”或(Defender 方法)新功能,允许开发人员在不破坏这些接口的现有实现的情况下向接口添加新方法。

        它提供了允许接口定义实现的灵活性,该实现将在具体类无法为该方法提供实现的情况下用作默认值。

        interface OldInterface {
            public void existingMethod();
        
            default public void DefaultMethod() {
                System.out.println("New default method" + " is added in interface");
            }
        }
        //following class compiles successfully in JDK 8
        public class ClassImpl implements OldInterface {
            @Override
            public void existingMethod() {
                System.out.println("normal method");
        
            }
            public static void main(String[] args) {
                ClassImpl obj = new ClassImpl ();
                // print “New default method add in interface”
                obj.DefaultMethod(); 
            }
        }
        

        【讨论】:

          【解决方案8】:

          如果你想要一个可实例化的类,那是不可能的。不过,您可以尝试定义一个 abstract 类。

          【讨论】:

            【解决方案9】:

            如果您尝试实现一个接口并且发现自己处于不需要实现所有接口的情况下,这就是代码异味。它表示一个糟糕的设计,它违反了Liskov substitution principle。这通常是因为使用了fat interface

            有时也会发生这种情况,因为您尝试从外部依赖项实现接口。在这种情况下,我总是在源代码中查看是否有该接口的任何实现,我可以直接使用它,也可以对其进行子类化并根据需要覆盖方法。

            【讨论】:

              【解决方案10】:

              我们可以使用适配器类,通过不强制实现接口中存在的所有方法来降低复杂性

              Adapter 类是一个简单的 java 类,它实现了一个只有 EMPTY 实现的接口。 如果我们扩展 Adapter 类而不是实现接口,我们只为 require 方法提供实现

              ex --- 如果我们扩展 GenericServlet(AC) 而不是实现 Servlet(I),那么我们为 Service() 方法提供实现,我们不需要为剩余的方法提供实现..

              通用类充当 Servlet(I) 的 ADAPTER 类。

              【讨论】:

                【解决方案11】:

                是的,下面显示的是方式

                interface Test {
                   void m() throws NullPointerException;
                }
                class Parent {
                   // Parent class doesn't implements Test interface
                   public void m() {
                      System.out.println("Inside Parent m()");
                   }
                }
                class Child extends Parent implements Test {
                }
                public class Program {
                   public static void main(String args[]) {
                      Child s = new Child();
                      s.m();
                   }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2015-03-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-04-09
                  • 2015-12-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多