我们如何使用 Java 接口强制执行双向接口



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

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

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 不支持多重继承,因此如果客户端/实现器已经是派生类(典型),则不能使用抽象类。

感谢您的帮助,杰夫

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

你需要的可能是这个:

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 中通常的解决方案是在任一对象中使用一个返回另一个对象的方法:

public class ViewControl {
    public IModel getModel() {...}
}

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

public class ViewControl {
    public ViewModel getViewModel( IModel model ) {...}
}

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

最新更新