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

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
    }

}