我已经阅读了发布SO问题所需的the post研究工作。我再次感到惭愧,将这个问题发布到一堆问题上。但我仍然不了解java中的接口。它们具有未实现的方法,然后为实现它们的每个类定义。我搜索了一下。接口用于支持java中的多重继承,也避免(致命)继承的Diamond Death。我也遇到了Composition vs Inheritance,并且继承不是代码重用,而是多态。因此,当我有一个公共代码作为扩展类时,由于多重继承而无法支持,因此可以选择使用接口(如果我错了,请纠正我)。我还发现,在大多数情况下,定义通用实现是不可能的。那么在接口方法的公共定义(不是完美的通用实现)中然后在必要时覆盖它以及为什么java不支持它的问题是什么呢。例如。当我有100个实现接口的类时,其中70个具有共同的实现,而其他具有不同的实现。为什么我必须在70多个类的接口中定义公共方法,为什么我不能在Interface中定义它们然后在其他30个类中覆盖它们,这使我免于在70个类中使用相同的代码。我对接口的理解是错误的吗?
答案 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)
您应该先了解界面的基础知识。这是
答案 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");
}
}
现在为First
和Second
public class First extends DefaultPrinter
{
}
public class Second extends DefaultPrinter
{
}
现在这两个仍然是Printable
。现在,了解如何正确设计对象层次结构非常重要。如果某事不,则DefaultPrinter
您不能也不应使新课程延长DefaultPrinter