0

我试图了解创建抽象接口何时有用。

我知道如果您创建一个接口,则方法必须是公共的,因此对于服务来说很好。但是如果服务是一个抽象接口会发生什么呢?那有意义吗?

如果我创建了一个服务声明的抽象接口并且某些方法是私有的,那么实现这个接口的类会看到私有方法,而另一个(另一个应用程序或类似的)不会看到这个方法,对吗?

我这是一个正确的实现吗?

最后,在很多人可以因我的错而入睡之后,我编写了我的解决方案,等待。

package cat.base.gpt.domini;
public interface IExpMS extends Serializable{
... methods here..
}

public interface IExpMSDetallGIM extends IExpMS { 
more methods here..
}


public interface IExpMSDetallOGC extends IExpMS{
..no methods just inheritance.
}

package cat.base.gpt.domini.impl;
import cat.base.gpt.domini.IClauExpedient;
import cat.base.gpt.domini.IExpMS;
public class ExpMS implements IExpMS{
..atributs and @overide methos interface
}
public class ExpMSDetallGim extends ExpMS implements IExpMSDetallGIM {..}
public class ExpMSDetallOGC extends ExpMS implements IExpMSDetallOGC  {..}

*每个方法都是公开的,属性是私有的。也许我可以在受保护的接口中编写方法,但我不太确定……如果有人需要查看完整代码,我无法发布或通过电子邮件发送。

如果 ypu 想查看数据库视图来考虑我的解决方案,这里有:

通用视图 指数管理系统 IExpMSDEtalOGC ![IExpMSDetallGIM 4

泰。

在此处输入图像描述

4

3 回答 3

3

接口总是抽象的。他们定义了interface一个类,所以他们只关心公共方法,不管是什么语言,我想。

虽然私有方法是实现细节而不是接口,但它们不能在接口中声明。

如果您希望私有方法在一组类中相同,则可以创建具有受保护方法的基本抽象类。

摘要的意思是“你不能创建这种类型的成员”。

接口只是对一些类属性的描述。它们总是抽象的,而您不能创建接口的实例。

查看链接http://www.ronaldwidha.net/2008/06/16/a-good-example-of-abstract-class-vs-interface/ - 它描述了 C# 中的代码,但它是一回事,只有关键字不同。

于 2013-09-20T07:33:24.457 回答
2

我正在使用 java.. 是一样的吗?所以接口 = 抽象接口?

在 Java 7 中,是的。在 Java 7(或更早版本)中,aninterface是隐式抽象的。接口本身不包含它指定的任何方法的主体,因此创建实例没有任何意义。

在 Java 8 中,可以defaultinterface. 这些默认方法的主体中包含可执行代码,但(自然)它们不能直接引用实例的状态。(实例状态变量在实现接口的类中声明......并且default方法不能引用尚未声明的东西,也可能永远不会被声明。)

但是,您仍然无法创建 Java 8 的实例interface,因此在类是抽象的意义上它仍然是抽象的abstract

然后你问这个:

如果我创建了一个服务声明的抽象接口并且某些方法是私有的,那么实现这个接口的类会看到私有方法,而另一个(另一个应用程序或类似的)不会看到这个方法,对吗?

abstract这是正确的......但这与关键字在Java中的含义无关。事实上,这描述了所有 Java 类的行为方式……相对于private成员的可见性。

于 2013-09-20T07:40:23.000 回答
2

接口的主要目的是允许“同一事物”的多种不同实现。接口的用户不依赖于特定的实现,这可以很好地分离关注点。以后可以添加新的实现并且可以扩展程序,而无需修改使用它们的代码。

想象一下,您将如何编写一个程序来汇总来自各种数据源的数字。您可以为每种类型的数据源(例如 csv、xls、数据库表)编写一个单独的程序。但随后,“总结”逻辑将被重复。如果要添加新的数据源类型,则必须从头开始编写整个程序。

接口允许使其更灵活。您意识到,您的总结逻辑需要对数字列表进行操作。它不关心这些数字来自哪里。所以你定义了一个接口:

 interface NumberListProvider {
     List<Double> readNumbers();
 }

然后你让你的整个复杂算法只依赖于这个接口,并提供不同的实现(具体类),从 csv、xls 或各种数据库中读取数字。

于 2013-09-20T09:18:30.587 回答