0

我正在定义一个接口来处理不同类型的输入源,如 CSV 文件、SQL 表等,以便我可以轻松地将数据从一个复制到另一个。为了实现这一点,我有一个供读者使用的界面和一个供作者使用的界面。由于它们有一些共同的属性,我想定义一个抽象接口ICommonContainer

公共容器接口是不完整的,因为它只定义了一个子集,所以我想,如果我添加抽象,它在应用于类时不应该是可实例化的,但它是。

那么是否有某种方法可以将接口声明为类似于抽象类的不完整接口?

所以接口看起来像这样:

public interface ICommonContainer
{
    public void foo();
};

public interface Reader extends ICommonContainer
{
    public data read();
};

public interface Writer extends ICommonContainer
{
    public void write(data objects);
};

reader 和 writer 应该是完整的,但 base 不是。

4

5 回答 5

2

没有这样的事情Abstract interface。我们将类抽象化以使其不可实例化。任何接口本质上都是不可实例化的。

就您的问题而言,您可以使您的类实现任意数量的接口。在您的情况下,由于您的接口是同一继承层次结构的一部分,因此您不需要同时实现Base接口和Reader/或Writer接口。所以,让它实现或者实现Reader接口Writer


另一方面,如果你想让一个只实现ICommonContainer接口的类是非不稳定的,那就做那个类abstract。那就足够了。

public abstract class SomeClass implements ICommonContainer {
    // Either define the method in interface or leave it.
}

正如上面的例子,你SomeClass不能被实例化,因为它是抽象定义的。

于 2013-06-27T13:37:19.290 回答
1

公共容器接口是不完整的,因为它只定义了一个子集,所以我认为,如果我添加抽象,它在应用于类时不应该是可实例化的,但它是。

不,您不能实例化接口。

不,没有办法阻止某些类实现该接口。

您的工作是实现ReaderWriter您的示例名称与应用的 Java 命名约定),而您不必实现Base

于 2013-06-27T13:37:56.560 回答
1

不,您不能声明接口抽象。

而且您不能阻止世界拥有一个实现您的接口并且不是抽象的类(如果它是公共的)。

我认为这没问题,如果有人可以仅使用您的 ICommonContainer 编写一个完整的类,那就没有问题了。

于 2013-06-27T13:42:14.913 回答
1

您可以将接口包设为私有,这可能会完成您想要的,但更大的问题是为什么?

Java 库中有很多“不完整”的接口;或者更好的解释方式是它们是部分完整的。列表就是其中之一。

一个列表可以被认为是部分完整的,因为通常你需要更多的东西。比如排序(ArrayList),或者保证快速插入(LinkedList)。具体类负责完整性。

你试图做的事情违背了体面的设计原则。我认为这是糟糕的设计原则,因为您应该将您的界面设计为足以满足某种程度的要求。给定列表示例,对于某些类,知道有一个可迭代的对象集合就足够了。这使得一个好的界面设计。接口的用户与此类的实现松散耦合。

于 2013-06-27T13:40:39.990 回答
0

您可以拥有一个与阅读有关的“部分”界面,另一个与写作有关的界面,以及另一个用于“缺失”功能的界面。然后,具体类的每个用户都会将其转换为所需的接口。

于 2013-06-27T13:42:56.973 回答