Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Interface - Fatal编程技术网

Java 接口的目的继续

Java 接口的目的继续,java,oop,interface,Java,Oop,Interface,所以我认为接口是一种强制对象实现一定数量功能的方法,而不必使用继承。有点像合同。我明白他们的意思 但如果界面中的所有内容都是: public interface animal{ void eat(object food); } 而且它本身没有实现,那么无论谁使用你的接口,每次都必须从头开始编写它 如果您要创建许多类,所有这些类都实现了这些特性,而实现只是略有不同,那么这将是一项艰巨的工作 我很感激任何能帮助我理解这一点的帮助,因为我知道这一点非常重要。通过这种方式,您可以在一个类中实现(

所以我认为接口是一种强制对象实现一定数量功能的方法,而不必使用继承。有点像合同。我明白他们的意思

但如果界面中的所有内容都是:

 public interface animal{
  void eat(object food);
}
而且它本身没有实现,那么无论谁使用你的接口,每次都必须从头开始编写它

如果您要创建许多类,所有这些类都实现了这些特性,而实现只是略有不同,那么这将是一项艰巨的工作

我很感激任何能帮助我理解这一点的帮助,因为我知道这一点非常重要。

通过这种方式,您可以在一个类中实现(比如)eat(),该类作为数据成员合并到所有动物中。编写一次,重用它,但不要将一种功能明确绑定到另一种功能


如果你有两种(或十种)不同的饮食方式,你可以根据需要将它们替换掉。

是的,你需要随时实现它,但每次都可以以不同的方式实现,任何调用它的类都不需要担心它是如何实现的


例如,如果您有一个包含一群动物(新老虎()、狮子()、熊())的动物园对象,那么您的动物园可以为某个集合a中的每种动物a执行操作。eat()将起作用。动物园不在乎有三种不同类型的动物以完全不同的方式进食。

你混淆了界面和遗传。它们是不同的概念,可以相互补充。如果所有eat方法只是略有不同,那么您可以创建一个基类,该基类将包含公共代码,并将通过添加不同部分的重写方法从子类调用。基类仍然可以实现接口。希望这是清楚的

而且它本身没有实现 那么无论谁使用你的界面都有 从头开始写……每次

接口的每个实现可以是不同的。关键是您可以在不知道实现的情况下使用接口。考虑例子:

public interface ILogger
{
    void WriteMessage(string message);
}
您的应用程序可以使用
ILogger
接口来记录错误/调试信息等。但不管记录器是如何实现的,它可以是
FileSystemLogger
,或
DatabaseLogger
,或任何其他实现。因此,您可以随时替换实现,而无需更改代码中提到日志记录的所有位置

如果您要创建许多类,所有这些类都实现了这些特性,而实现只是略有不同,那么这将是一项艰巨的工作

在这种情况下,您可以轻松地在类的层次结构中创建另一层,该层实现了
动物
,但它是所有以某种方式进食的动物的祖先类

class Herbivore implements Animal {
  public void eat(Object food) {
   ...
  }
}

class Cow extends Herbivore..
class Horse extends Herbivore..
您可以使用
super.eat()
覆盖
eat
,只更改微小部分


您应该同时期待代码重用和组件封装。。然后,如果您的接口实际上没有描述类本身,而只是类的一个组件,那么您可以按照Carl Manaster的建议进行组合。

您应该将接口视为一种权威的行为声明,它首先与实现问题无关

如果您希望避免代码重复,那么可以将抽象基类与接口结合使用。在这里,您可以实现所有可能在所有接口实现类中重复的内容

HTH.

托马斯

你在倒着想。 不要首先考虑实现,而是首先考虑行为(如方法签名所述)。然后在基类中实现适当的行为,从而提供更灵活、可扩展的系统。
您很快就否定了“契约式设计”,但这是一个关键的设计策略,也是web服务、SOA等的基础。

使用接口更多的是让消费代码了解您对它的期望,而不是您需要关注消费代码的细节

例如,我们经常使用接口的方式之一是在业务层/数据访问层

因为我们的业务层(BL)组件将直接与数据访问层(DAL)通信在汇编中,DAL无法直接与BL通信。如果DAL希望使用对象而不是单个字段,会发生什么?您必须定义自己的DAL对象,并使用刚刚收到的输入将其水合。基本上,更多的工作、更多的资源消耗,以及多个表示相同数据的对象这会成为维护的噩梦

但是,如果您在DAL中定义接口,您可以告诉DAL的使用者它期望的是什么。然后您可以在BL中实现这些接口,并传递接口的实例,而不是BL对象

接口都是关于抽象出实现的细节,而这些细节并不是绝对必要的

[编辑]
如果有许多对象执行类似的操作,那么将接口和基类与可重写/虚拟方法相结合可能比只使用接口更有用。

接口是在Java中创建多重继承的唯一方法

假设你创建了一个类
Animal
。所有的动物,包括人类都扩展了这个类。这些动物中的每一个都继承了吃、呼吸等常用方法

但是现在让我们假设您有一个
数学问题
类。 您希望有某些类可以通过将问题传递给
solve(MathProblem问题)
方法来解决该问题。 你知道一个
,还有一个
计算机
可能会解决这个数学问题。所以他们都需要能够解决这个问题
public int compareTo(T anotherObject)