【问题标题】:connecting two classes with each other将两个类相互连接
【发布时间】:2018-10-22 16:40:00
【问题描述】:

所以,我想创建两个类之间的关联,根据我在一些设计模式中阅读的内容,使用接口很方便,(在 Android Studio 中,它用于将片段与活动绑定)。

看看这段代码:

首先,我们有 A 类:

public class A {

public static void main(String[] args) {
    B b = new B();
    b.foo();
}
}

然后,我们有 B 类:

class B {
private int i;

interface Drawable {
    void show(int i);
}

public B() {
    this.i = 5393;
    drawable = new C();
}
private Drawable drawable;

public void foo() {
    drawable.show(this.i);
}
}

最后是 C 类:

class C implements B.Drawable {

@Override
public void show(int i) {
    System.out.println("I'm showing this method, and i = " + i);
}
}

我想到的是这一行:

drawable = new C();

谁能解释一下我们如何将新对象从 C 类分配给一个接口,我知道这是因为 C 类实现了该接口,但是,我很难得到它。这个操作的一般观点对我来说是非常苛刻的。

在 Android 中,我们将该接口分配给一个 Activity,(最近的补丁将其更改为一个上下文,它是一个 Activity 的实例)。

【问题讨论】:

标签: java android class interface


【解决方案1】:

这是在工作的多态性。

在 Java 中,您可以将子类(或接口的实现)的实例分配给超类(或接口)类型的变量。

现在,接口实际上不能被实例化。您不能在接口上调用new 并获取该接口的实例。但是,您可以创建接口类型的变量(在本例中为B.Drawable),并为其分配任何实现类的实例(在本例中为C)。

获得一些直觉的一种简单方法是:

考虑一个类型为Car 的接口,用于视频游戏。假设它只包含一些方法,代表汽车的行为(具体来说,我们可以让汽车做什么)。说它有startEngine()changeGear()driveAhead()等这样的方法。这些的具体实现可能不同(齿轮可以手动或自动更换,点火系统可以更换等)但是,所有汽车都有这些通用方法,您可以创建一个Car 类型的变量,然后使用它在视频游戏中。您将有一组方法来调用任何类型的汽车,从而简化您的编码。

但是接口不能被实例化。因此,您可以在各种类中实现它,并实例化这些类。你可以拥有一辆梅赛德斯、一辆法拉利、其他一些汽车,它们有自己的属性和自己的方法实现。无需为每种类型的汽车创建单独的引用变量,您只需将任何汽车的实例(通过语句短语new Mercedes()new Ferrari() 等获得)分配给 Car 变量。然后只需使用 Car 中声明的方法即可。

【讨论】:

  • 感谢您的回答,非常好的可视化。我不确定的一件事是,您可以“有点”实例化一个在其上调用“new”的接口,您只需要实现它的匿名版本。是的,我知道,它不会直接成为接口,而是它的“子”实现。像这样: someInterface s = new someInterface() { @Override public void show() { System.out.println("Hello there"); } }; s.show();
  • 是的,这仍在创建一个已实现的接口,但它是匿名的,在其他任何地方都不可用。我不确定字节码和内存中的实现是如何工作的,但从逻辑上讲,它类似于在另一个类中实现接口,就像在你的问题中一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2018-02-28
  • 2017-01-13
相关资源
最近更新 更多