Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用接口与两个组件通信?_Java_Interface - Fatal编程技术网

Java 如何使用接口与两个组件通信?

Java 如何使用接口与两个组件通信?,java,interface,Java,Interface,我正在开发一个基于组件的软件,我有两个相互通信的组件。我有一个预订组件来管理预订流程,还有一个度假村组件来管理度假村详细信息(可用房间、房间详细信息、客户等)。预订组件有一个IReservation界面,度假组件有一个IResort界面。界面如下所示 i观察 public interface IReservation{ void makeReservation(Client c); RoomDetails getRoomDetails(int roomNumber); } I

我正在开发一个基于组件的软件,我有两个相互通信的组件。我有一个预订组件来管理预订流程,还有一个度假村组件来管理度假村详细信息(可用房间、房间详细信息、客户等)。预订组件有一个IReservation界面,度假组件有一个IResort界面。界面如下所示

i观察

public interface IReservation{

    void makeReservation(Client c);
    RoomDetails getRoomDetails(int roomNumber);
}
IResort

public interface IResort{

    RoomDetails getRoomDetails(int roomNumber);
}
请注意,两个接口都有相同的方法
getRoomDetails

我希望当预订组件需要获取房间详细信息时,IReservation接口通过IResort接口将调用传递给度假组件,因此,度假组件可以执行degetRoomDetails,并通过IReservation界面将房间详细信息返回到预订组件。
那么,我如何才能让预订组件将调用传递给度假组件,并从中获取房间详细信息呢?

一个接口不能将调用传递给另一个接口-只有具体的实现才能做到这一点

创建预订组件(实现
IReservation
)时,在构造函数中或通过setter方法向其传递对度假组件(实现
IResort
)的引用

然后,当预订组件需要房间详细信息时,只需调用
IResort
组件的
.getRoomDetails()
方法


(这是假设您确实希望IReservation和IResort使用单独的组件,并且您希望按照所述保留这两个接口;例如,您可以使用相同的类实现这两个接口,或者创建一个新接口来保存
getRoomDetails
,如Krab在评论中所述)

如果您愿意放弃两者都必须是接口的条件,您可以通过将
IReservation
声明为抽象类来强制执行您的条件:

// implements is not necessarily needed, but here it does fit since each
// Reservation is bound to an IResort
public abstract class AReservation implements IResort {

    IResort resort;

    public AReservation(IResort resort) {
        this.resort = resort;
    }

    abstract public void makeReservation(Client c);

    // forward getRoomDetails to resort's getRoomDetail,
    // make method final to prevent overriding.
    public final RoomDetails getRoomDetails(int roomNumber) {
        return this.resort.getRoomDetails(roomNumber);
    }
}

public interface IResort {

    public RoomDetails getRoomDetails(int roomNumber);
}

解决方案是否需要是接口?否则,您可以将
IReservation
定义为抽象类,并为其指定类型为
IResort
的属性和最终方法
getRoomDetails(int)
,它只是将调用转发到
IResort
属性。我将使用
getRoomDetails
添加新的接口
IRoomInfo
,并让
IReservation
IResort
扩展它
IReservation
实现将推动调用
IRoomInfo.getRoomDetail
IResort.getRoomDetails