我正在浏览Bridge模式并且很少有人怀疑。我从一个网站下面的代码中创建了一个abstarct类作为接口。
abstract class Vehicle {
protected Workshop workShop1;
protected Workshop workShop2;
protected Vehicle(Workshop workShop1, Workshop workShop2) {
this.workShop1 = workShop1;
this.workShop2 = workShop2;
}
abstract public void manufacture();
}
public interface Workshop {
abstract public void work();
}
这就是为什么我们创建了一个为接口声明2个对象的构造函数?
public class Car extends Vehicle {
public Car(Workshop workShop1, Workshop workShop2) {
super(workShop1, workShop2);
}
@Override
public void manufacture() {
System.out.print("Car ");
workShop1.work();
workShop2.work();
}
}
同样的事情为什么在传递接口的引用对象时再次声明构造函数?
答案 0 :(得分:0)
接口定义了公共对象的接口。实现接口的所有对象必须实现接口中定义的方法。因此,您有一个Car
类,可以扩展您的abstract class Vehicle
,因此必须实现void manufacture()
方法。此外,扩展Vehicle
的类也获取抽象类中定义的变量。此外,扩展类必须调用抽象类中定义的构造函数之一(如果没有定义构造函数,则不需要调用任何东西)。
Vehicle
有一个带有两个Workshop
对象的构造函数的事实意味着当你尝试实例化任何的工具(即Car
)时,你< em>必须提供实现Workshop
接口的对象。
拼图中缺少的部分是实现Workshop
界面的具体类。如果您有:
public class NoWork implements Workshop{
@Override
public void work(){
// do no work
}
}
然后您可以通过以下方式实例化Car
类(作为示例):
public static void main(String ...args){
final Workshop noWork1 = new NoWork();
final Workshop noWork2 = new NoWork();
final Vehicle car = new Car(noWork1, noWork2);
}
请注意,由于NoWork
实现了Workshop
,因此{em>也类型为Workshop
,因此宣布noWork1
是合法的(和2)作为Workshop
对象事件,尽管它们实际上是NoWork
个对象。同样,请注意,由于Car
延伸Vehicle
,它会将car
声明为Vehicle
,即使它实际上是Car
(但请记住Car
a Vehicle
)。
但是,为了澄清,你不必须为每个扩展类提供两个Workshop
类到Vehicle
,你可以有类似的东西:< / p>
public class NoVehicle extends Vehicle{
public NoVehicle(){
super(null, null);
}
@Override
public void manufacture(){
// do nothing...there's nothing to be done
}
}
但请注意任何扩展类必须调用超级构造函数。
答案 1 :(得分:0)
如果您在教程link中看到桥梁模式图,他们假设有两种类型的工作班次
因此,他们使用了两个instacne of workshope接口,一个用于Producer,另一个用于Assemble。