我正在定义一个接口来处理不同类型的输入源,如CSV文件,SQL表等,这样我就可以轻松地将数据从一个复制到另一个。
为了实现这个目标,我有一个读者界面和一个作家界面。由于它们有一些共同的属性,我想定义一个ICommonContainer
的抽象接口。
公共容器接口是不完整的,因为它只定义了一个子集,所以我想,如果我添加abstract,它在应用于类时不应该是可实例化的,但它是。
那么有没有办法将接口声明为类似于抽象类的不完整?
所以接口看起来像这样:
public interface ICommonContainer
{
public void foo();
};
public interface Reader extends ICommonContainer
{
public data read();
};
public interface Writer extends ICommonContainer
{
public void write(data objects);
};
读者和作者应该完整,但基础不是。
答案 0 :(得分: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
无法实例化,因为它是定义为抽象的。
答案 1 :(得分:1)
公共容器接口不完整,因为它只定义 一个子集,所以我想,如果我添加抽象,它不应该 应用于类时可实例化,但它是。
不,你无法实例化界面。
不,没有办法阻止某些类实现该接口。
您的工作是实施Reader
和Writer
(您的示例名称与应用的Java命名约定),您不必实现Base
答案 2 :(得分:1)
您可以将接口包设为私有,这可能会达到您想要的效果,但更大的问题是为什么?
在Java库中有许多“不完整”的接口;或者更好的解释方法是它们是部分完整的。列出是其中之一。
列表可以被视为部分完成,因为通常您需要更多内容。如排序(ArrayList),或保证快速插入(LinkedList)。具体课程注重完整性。
你想做的事情违背体面的设计原则。我认为这个糟糕的设计原则是因为您应该将接口设计为足够某种程度。给定列表示例,对于某些类,知道存在可迭代的对象集合就足够了。这使得良好的界面设计成为可能。接口的用户与这样的实现松散耦合。
答案 3 :(得分:1)
不,你不能声明一个接口摘要。
并且你不能阻止世界拥有一个实现你的接口的类,而不是抽象的(如果是公共的)。
我认为这没关系,如果有人可以使用你的ICommonContainer编写一个完整的类,那就没问题了。
答案 4 :(得分:0)
你可以有一个“部分”界面,它与阅读有关,另一个用于写作,另一个界面是“缺失”功能。然后,具体类的每个用户都将其转换为所需的接口。