Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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_Private_Observer Pattern - Fatal编程技术网

我们如何用Java接口实现双向接口?

我们如何用Java接口实现双向接口?,java,interface,private,observer-pattern,Java,Interface,Private,Observer Pattern,Java不允许私有或受保护的方法,那么我们如何确保双向接口的实现者调用必要的方法呢 假设我们有一个IModelListener接口,如下所示: public interface IModelListener { public void handleChannelUpdate(int channel); } public class ViewControl implements IModelListener 然后我们有一个ViewControl客户端,如下所示: public i

Java不允许私有或受保护的方法,那么我们如何确保双向接口的实现者调用必要的方法呢

假设我们有一个IModelListener接口,如下所示:

public interface IModelListener
{   
    public void handleChannelUpdate(int channel);
}
public class ViewControl implements IModelListener
然后我们有一个ViewControl客户端,如下所示:

public interface IModelListener
{   
    public void handleChannelUpdate(int channel);
}
public class ViewControl implements IModelListener
只要记住让ViewControl调用以下命令,ViewControl对象就可以工作:

model.registerChannelListener(this);
如果Java允许在接口中使用受保护或私有方法,我们只需将IModelListener修改为:

public interface IModelListener
{   
    public void handleChannelUpdate(int channel);
    private void registerChannelListener( );
}
如何做到这一点? 是否有可以这样做的注释

Java不支持多重继承,因此如果客户机/实现程序已经是派生类(典型),那么使用抽象类就不是一个选项

谢谢你的帮助,
Jeff

您想要的是在类上强制执行默认行为-在Java中,抽象类是制定所有扩展类继承的默认行为的地方(请参阅此应用程序的模板方法设计模式)。接口仅描述对象的外部行为以及其他人如何使用它们。

您想要的是在类上强制执行默认行为-在Java中,抽象类是制定所有扩展类继承的默认行为的地方(请参阅此应用程序的模板方法设计模式)。接口仅描述对象的外部行为以及其他人如何使用它们。

接口是向实现接口的类的用户提供公共契约的一种方式。类是如何实现的并不重要,只要它们遵守契约。因此,在接口中使用私有方法是没有意义的。

接口是向实现接口的类的用户提供公共契约的一种方式。类是如何实现的并不重要,只要它们遵守契约。因此,在接口中使用私有方法是没有意义的。

您可能忽略了接口的概念。它不能包含私有或受保护的方法,因为接口的作用是提供可访问的方法集。另一方面,您可能会研究抽象类

您需要的可能是:

public abstract class AbstractViewControler implements IModelListener {

    protected abstract void registerChannelListener();

    protected AbstractViewControler() {
        this.registerChannelListener();
    }
}
然后:

public class MyViewControler extends AbstractViewControler {

    protected void registerChanelListener() {
        //- Do what you need here.
    }
}
在那之后:

IModelListener listner = new MyViewControler();

您可能错过了接口的概念。它不能包含私有或受保护的方法,因为接口的作用是提供可访问的方法集。另一方面,您可能会研究抽象类

您需要的可能是:

public abstract class AbstractViewControler implements IModelListener {

    protected abstract void registerChannelListener();

    protected AbstractViewControler() {
        this.registerChannelListener();
    }
}
然后:

public class MyViewControler extends AbstractViewControler {

    protected void registerChanelListener() {
        //- Do what you need here.
    }
}
在那之后:

IModelListener listner = new MyViewControler();

java中的接口旨在通过在类中实现的签名来提供接口功能的签名,因此它不应该是私有的

您的需要:您可以使用抽象方法和一些您想要的默认语句


您可以拥有所有类型的访问说明符。

java中的接口旨在提供接口功能的签名,即您在类中实现的签名,因此它不应是私有的

您的需要:您可以使用抽象方法和一些您想要的默认语句


您可以拥有所有类型的访问规范。

在Java中,您不能仅使用接口

如果您想要实现某种“自动绑定”(即在所有相关对象上自动调用
model.registerChannelListener(this);
),那么您应该让这些对象实现一个空接口,通过内省检索实现它的类的所有实例的列表,并对它们进行迭代

您可以定期或在程序中的某个特定点执行此操作。您还可以使用@interface注释来添加一些语法上的糖分


您可能还希望使用依赖项注入和/或工厂反转流程并创建对象,以便在创建后立即使用名为“自动”的方法(如使用
@PostConstruct
)。

在Java中,您不能仅使用接口

如果您想要实现某种“自动绑定”(即在所有相关对象上自动调用
model.registerChannelListener(this);
),那么您应该让这些对象实现一个空接口,通过内省检索实现它的类的所有实例的列表,并对它们进行迭代

您可以定期或在程序中的某个特定点执行此操作。您还可以使用@interface注释来添加一些语法上的糖分


您可能还想反转流程,使用依赖项注入和/或工厂创建对象,以便在创建后立即使用名为“自动”的方法(如使用
@PostConstruct
)。

接口是错误的查找位置

Java中解决此类问题的常用方法是在任何一个对象中使用一个方法,该方法返回另一个:

public class ViewControl {
    public IModel getModel() {...}
}
然后,该方法可以确保模型和视图正确连接。现在我想你不想把视图和模型结合起来。然后,解决方案是定义一个新的
ViewModel
类型,该类型仅委托给真实模型(大多数IDE允许通过3-5次鼠标单击创建委托类型):


您应该能够将此代码移动到所有视图都从中继承的基本(
abstract
)视图类。

接口是错误的查看位置

Java中解决此类问题的常用方法是在任何一个对象中使用一个方法,该方法返回另一个:

public class ViewControl {
    public IModel getModel() {...}
}
然后,该方法可以确保模型和视图正确连接。现在我想你不想把视图和模型结合起来。然后,解决方案是定义一个新的
ViewModel
类型,该类型仅委托给真实模型(大多数IDE允许通过3-5次鼠标单击创建委托类型):