所以,我想在两个类之间创建一个关联,从我在一些设计模式中读到的,方便的,使用一个接口,(在Android Studio中,它用于将片段与活动绑定)。 / p>
看看这段代码:
首先,我们有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的实例)。
答案 0 :(得分:0)
这是多态性在起作用。
在Java中,您可以将子类的实例(或接口的实现)分配给类型为超类(或接口)的变量。
现在,实际上无法实例化接口。您无法在接口上调用new
并获取该接口的实例。但是,可以创建接口类型的变量(在本例中为B.Drawable
),并为其分配任何实现类的实例(在本例中为{{1 }})。
获得一些直觉的一个简单方法是:
考虑类型C
的接口,用于视频游戏。假设它只包含一些方法,代表汽车的行为(具体来说,我们可以让汽车做什么)。假设它有Car
,startEngine()
,changeGear()
和其他此类方法。这些的确切实现可能是不同的(齿轮可以手动或自动更换,点火系统可能会改变等)。但是,所有汽车都有这些常用方法,你可以制作driveAhead()
类型的变量,然后在视频游戏中使用它。您可以使用一组方法来调用任何类型的汽车,从而简化编码。
但是接口无法实例化。所以你在各种类中实现它,实例化这些类。你可以拥有梅赛德斯,法拉利,其他一些汽车,拥有自己的属性,以及他们自己的方法实现。您可以简单地将任何汽车的实例(通过语句短语Car
,new Mercedes()
等获得)分配给Car变量,而不是为每种类型的汽车创建单独的参考变量。然后只使用Car中声明的方法。