Java 如何同时提供两个接口(“公共”和“扩展”接口)?
我让块使用函数Java 如何同时提供两个接口(“公共”和“扩展”接口)?,java,oop,Java,Oop,我让块使用函数step()执行计算。这些块可以连接到 用连接(块)相互连接 但是,在具体的块实现中(例如在步骤中),应该 可以从连接的块读取: class ABlockImpl implements Block { private Block src; // link to the block this block is connected to public void connect(Block b) { src = b; } public v
step()
执行计算。这些块可以连接到
用连接(块)
相互连接
但是,在具体的块实现中(例如在步骤中
),应该
可以从连接的块读取:
class ABlockImpl implements Block {
private Block src; // link to the block this block is connected to
public void connect(Block b) {
src = b;
}
public void step() {
double x = src.read(); // XXX src is of type Block and there is no read() in Block
/* ... */
}
public double read() {
return 3.14;
}
}
由于块中没有read()
,因此无法编译。对于客户端,“公共”块接口就足够了,我只需要内部读取。我可以将read
添加到块界面,但我觉得这是错误的
由于有多个不同的Block实现,我无法在调用read
之前将src
转换为ablockinpl
是否有另一种方法“隐藏”读取
?您可以在接口
和块的具体实现之间创建抽象
层,并将其命名,例如,块适配器
即:
您可以在接口
和块的具体实现之间创建抽象
层,并将其命名为块适配器
即:
您可以有一个公共接口和一个包本地接口
public interface MyPublicInterface {
}
interface MyDirectInterface extends MyPublicInterface {
}
class MyImpl implements MyDirectInterface {
public void add(MyPublicInterface mpi) {
MyDirectInterface mdi = (MyDirectInterface) mpi;
// use mdi
}
}
您可以有一个公共接口和一个包本地接口
public interface MyPublicInterface {
}
interface MyDirectInterface extends MyPublicInterface {
}
class MyImpl implements MyDirectInterface {
public void add(MyPublicInterface mpi) {
MyDirectInterface mdi = (MyDirectInterface) mpi;
// use mdi
}
}
我不认为有一个解决方案能完全满足您的需求,但可能有一些接近的解决方案:
接口块{
空心连接(b区);
无效步骤();
}
接口可读块扩展块{
双读();
}
方法read()
仍然需要公开,但是您可以让外部代码仅通过Block
接口引用实现,而实现本身来自ReadableBlock
public cass ablockinpl实现ReadableBlock{
....
}
Block b=new ablockinpl();
我不认为有一种解决方案能完全满足您的需求,但可能有一些与之相近的解决方案:
接口块{
空心连接(b区);
无效步骤();
}
接口可读块扩展块{
双读();
}
方法read()
仍然需要公开,但是您可以让外部代码仅通过Block
接口引用实现,而实现本身来自ReadableBlock
public cass ablockinpl实现ReadableBlock{
....
}
Block b=new ablockinpl();
请重新表述标题和问题,这会产生误导,我不得不读了三遍才明白你的意思。你有什么建议吗,我主要考虑的是如何表达它。听起来你只是想让一个类实现两个不同的接口,但我想你想要一个非公开的接口,对吗?我不确定。我想我想要一个没有read
的公共界面,以及一种块之间仍然读取
的方式。我想你不能也不想用界面来实现这一点。客户端可以提供自己的块实现,因此read()
必须是接口的一部分。听起来好像您希望自己提供所有实现。因此,我建议您发布一个带有私有read()
或其他内容的抽象类。请重新表述标题和问题,它具有误导性,我必须阅读3遍才能理解您的意思。您有什么建议吗,我主要在想如何表达它。听起来你只是想让一个类实现两个不同的接口,但我想你想要一个非公共的接口,对吗?我不确定。我想我想要一个没有read
的公共界面,以及一种块之间仍然读取
的方式。我想你不能也不想用界面来实现这一点。客户端可以提供自己的块实现,因此read()
必须是接口的一部分。听起来好像您希望自己提供所有实现。因此,我建议您发布一个带有私有read()
或其他东西的抽象类。我认为这个想法是在接口中不包含read()
。@johanneschad我认为,作者可能不想要它,因为在一般情况下,他必须将此方法实现添加到所有子类中Adapter
模式只允许在一个层中执行此操作,并且只在所需的子类中重写此方法。不,我不希望在接口中有read
(如果可能的话)。为什么不从接口中删除read
,但是在抽象类中定义它protected
?我不是定义它protected
,而是定义它package local
。事实上,最好定义它protected
。我这样做是因为问题的作者说:我只需要在内部读取read
Adapter
模式只允许在一个层中执行此操作,并且只在所需的子类中重写此方法。不,我不希望在接口中有read
(如果可能的话)。为什么不从接口中删除read
,但是在抽象类中定义它protected
?我不是定义它protected
,而是定义它package local
。事实上,最好定义它protected
。我这样做是因为问题的作者说:我只需要在内部阅读src
。当我将src
的类型更改为MyDirectInterface
时,我不能再在connect(Block)
中分配src
,因为调用者给我一个
public abstract class BlockAdapter implements Block {
double read() {
return -1; // ? something like that
}
}
public class ABlockImpl extends BlockAdapter { ... }
public interface MyPublicInterface {
}
interface MyDirectInterface extends MyPublicInterface {
}
class MyImpl implements MyDirectInterface {
public void add(MyPublicInterface mpi) {
MyDirectInterface mdi = (MyDirectInterface) mpi;
// use mdi
}
}