为什么接口没有实现方法并覆盖它们?

时间:2013-11-10 13:20:12

标签: java inheritance interface

我已经阅读了发布SO问题所需的the post研究工作。我再次感到惭愧,将这个问题发布到一堆问题上。但我仍然不了解java中的接口。它们具有未实现的方法,然后为实现它们的每个类定义。我搜索了一下。接口用于支持java中的多重继承,也避免(致命)继承的Diamond Death。我也遇到了Composition vs Inheritance,并且继承不是代码重用,而是多态。因此,当我有一个公共代码作为扩展类时,由于多重继承而无法支持,因此可以选择使用接口(如果我错了,请纠正我)。我还发现,在大多数情况下,定义通用实现是不可能的。那么在接口方法的公共定义(不是完美的通用实现)中然后在必要时覆盖它以及为什么java不支持它的问题是什么呢。例如。当我有100个实现接口的类时,其中70个具有共同的实现,而其他具有不同的实现。为什么我必须在70多个类的接口中定义公共方法,为什么我不能在Interface中定义它们然后在其他30个类中覆盖它们,这使我免于在70个类中使用相同的代码。我对接口的理解是错误的吗?

7 个答案:

答案 0 :(得分:5)

首先,Java中的接口(从Java 7开始)没有代码。这只是一个定义,是一个班级必须履行的合同。

  

那么有一个共同的定义(不是一个完美的定义)是什么问题   通用实现)接口方法然后重写它   必要的地方以及为什么java不支持它

是的,您可以在Java中执行此操作,而不是仅使用接口。我们假设我希望从Example接口获得method1的默认实现,但保留method2未实现:

interface Example {
   public void method1();
   public String method2(final int parameter);
}

abstract class AbstractExampleImpl implements Example {
    @Override
    public void method1() {
        // Implement
    }
}

现在,想要使用此method1默认实现的类只能扩展AbstractExampleImpl。这比在接口中实现代码更灵活,因为如果这样做,那么所有类都绑定到您可能不需要的实现。这是接口的优点:能够引用某个行为(契约),而不必知道类实际如何实现它,例如:

List<String> aList = MyListFactory.getNewList();

MyListFactory.getNewList()可以返回任何实现List的对象,我们的代码操作aList根本不关心,因为它基于接口。


  

如果使用接口的类已经是Sub-class,该怎么办?然后我们   不能使用Abstract类,因为不支持多重继承

我猜你的意思是这种情况:

class AnotherClass extends AnotherBaseClass

并且您也希望扩展AbstractExampleImpl。是的,在这种情况下,不可能使AnotherClass扩展AbstractExampleImpl,但您可以编写一个包含内部类来执行此操作,例如:

class AnotherClass extends AnotherBaseClass implements Example {
    private class InnerExampleImpl extends AbstractExampleImpl {
        // Here you have AbstractExampleImpl's implementation of method1
    }
}

然后,您可以通过调用其方法在内部使所有Example方法由InnerExampleImpl实际实现。


  

是否有必要在AnotherClass中使用接口?

我猜你的意思是AnotherClass implements Example。好吧,这就是你想要的:让AnotherClass实现Example一些默认实现以及扩展另一个类,或者我理解你错了。由于您不能扩展多个类,因此您必须实现该接口,以便进行

final Example anotherClass = new AnotherClass();

否则这是不可能的。

  

同样,对于实现接口的每个类,我都必须进行设计   内心阶级?

不,它不一定是内部类,这只是一个例子。如果您希望多个其他类具有此默认Example实现,您可以编写一个单独的类并将其包装在所需的所有类中。

class DefaultExampleImpl implements Example {
   // Implements the methods
}

class YourClass extends YetAnotherClass implements Example {
    private Example example = new DefaultClassImpl();

    @Override
    public void method1() {
          this.example.method1();
    }

    @Override
    public String method2(final int parameter) {
          return this.example.method2(parameter);
    }
}

答案 1 :(得分:2)

您可以为实施该界面创建抽象类,并使这些类继承 抽象类,那应该是你想要的。

答案 2 :(得分:0)

实现和接口的非抽象类需要从接口实现所有方法。抽象类不必实现所有方法,但不能启动。如果在示例中创建抽象类,则实现除一个之外的所有接口方法。从这些抽象类扩展的类只需要实现一个尚未实现的方法。

答案 3 :(得分:0)

Java接口本来可以被称为 contract ,以便更好地传达他们的意图。声明者承诺提供一些功能,并保证使用代码提供该功能。

这是一个强大的概念,并且与如何分离,在Java有点受限且您不是第一个注意到的情况下提供了该功能。我个人发现很难提供“完美”的实现,只需要一个或两个子类就可以在给定的情况下使用。 Swing使用适配器提供空实现,然后可以根据需要覆盖,这可能是您正在寻找的技术。

答案 4 :(得分:0)

您应该先了解界面的基础知识。这是

  • 用于提供紧密耦合意味着紧密封装
  • 它帮助我们隐藏我们的代码来自外部环境,即来自其他类
  • 接口应该只有定义和数据是常量
  • 它提供了扩展课程的设施。因此它不能被java中的任何其他类替换,否则该类将变得接近扩展。这意味着类将无法扩展任何其他类。

答案 5 :(得分:0)

接口的想法是创建一系列抽象方法,这些方法足以供实现它们的不同类使用。这个概念基于DRY原则(不要重复自己)界面允许你使用run()这样的方法,这些方法足够抽象,可以用于游戏循环,玩家能够运行,

答案 6 :(得分:0)

我认为你正在努力实现面向对象设计的概念。在上面的示例中,您声明了100个类,70个类具有相同的方法实现(我会被它惊呆)。所以给出这样的界面:

public interface Printable
{    
     void print();
}  

和两个具有print

“相同”实现的类
public class First implements Printable
{  
   public void print()  
   {  
         System.out.println("Hi");
   }  
}
public class Second implements Printable
    {  
       public void print()  
       {  
             System.out.println("Hi");
       }  
    }

你会想要这样做:

public abstract class DefaultPrinter implements Printable  
{  
     public void print()  
     {  
         System.out.println("Hi");
     }  
}

现在为FirstSecond

public class First extends DefaultPrinter 
{  
}
public class Second extends DefaultPrinter
{  
}

现在这两个仍然是Printable。现在,了解如何正确设计对象层次结构非常重要。如果某事,则DefaultPrinter 您不能也不应使新课程延长DefaultPrinter