我们如何用Java接口实现双向接口?
Java不允许私有或受保护的方法,那么我们如何确保双向接口的实现者调用必要的方法呢 假设我们有一个IModelListener接口,如下所示:我们如何用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
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次鼠标单击创建委托类型):