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
)视图类。