使用抽象界面的实际情况?

时间:2013-09-20 07:23:19

标签: java interface

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

我知道如果你创建一个接口,那么这些方法必须是公共的,所以对服务来说很好。但是,如果服务是抽象接口会发生什么?那有意义吗?

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

我这是一个纠正的实施?

最后在很多人可以按我的错误睡觉后,我写了我的解决方案,等待等等。

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  {..}

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

如果ypu想看到数据库视图来考虑我的解决方案,那么:

generic views IExpMS IExpMSDEtallOGC ![IExpMSDetallGIM 4

TY。

enter image description here

3 个答案:

答案 0 :(得分:3)

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

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

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

摘要表示“您无法创建此类型的成员”。

接口只是某些类属性的描述。它们总是抽象的,而您无法创建接口的实例。

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

答案 1 :(得分:2)

  

我正在使用java ..是一样的吗?so interface = abstract interface?

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

在Java 8中,可以在default中包含interface个方法。这些默认方法具有包含可执行代码的主体,但(当然)它们不能直接引用实例的状态。 (实例状态变量在实现接口的类中声明...而default方法不能引用那些没有,也可能不会被声明的东西。)

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

然后你问这个:

  

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

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

答案 2 :(得分:2)

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

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

接口允许更灵活。你意识到,你的总结逻辑需要在一个数字列表上运行。它并不关心这些数字的来源。所以你定义了一个接口:

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

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