当前位置: 首页 > 面试题库 >

“编程到接口”是什么意思?

巫晋鹏
2023-03-14
问题内容

我已经看过几次了,但我不清楚它的含义。您何时以及为什么要这样做?

我知道接口的作用,但是我不清楚这一点,这让我觉得我错过了正确使用它们的机会。

如果要这样做,是否只是这样:

IInterface classRef = new ObjectWhatever()

您可以使用任何实现的类IInterface吗?您什么时候需要这样做?我唯一能想到的是,如果您有一个方法并且不确定要实现的对象将传递什么对象IInterface。我想不出您需要多久这样做一次。

另外,如何编写一个方法来接受实现接口的对象?那可能吗?


问题答案:

对于这些问题,这里有一些奇妙的答案,涉及关于接口和松耦合代码,控制反转等的各种详细信息。这里有一些相当令人头疼的讨论,所以我想借此机会分解一下内容,以了解界面为什么有用。

当我第一次接触接口时,我也对接口的相关性感到困惑。我不明白你为什么需要他们。如果我们正在使用Java或C#之类的语言,那么我们已经拥有继承,我将接口视为一种较弱的继承形式,并认为“为什么要打扰?” 从某种意义上说我是对的,您可以将接口视为一种较弱的继承形式,但除此之外,我最终通过将它们视为对由其表现出的常见特征或行为进行分类的一种手段,最终将它们用作语言构造。可能有许多不相关的对象类别。

例如,假设您有一个SIM卡游戏,并且具有以下课程:

class HouseFly inherits Insect {
    void FlyAroundYourHead(){}
    void LandOnThings(){}
}

class Telemarketer inherits Person {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}
}

显然,就直接继承而言,这两个对象没有共同点。但是,您可以说它们都很烦人。

假设我们的游戏需要某种随机的东西,使玩家在吃晚餐时会感到烦恼。这可能是一个HouseFly或一个Telemarketer或两个-但你怎么允许对于用一个单一的功能?以及您如何要求每种不同类型的对象以相同的方式“做他们烦人的事情”?

要实现的关键是,尽管a Telemarketer和a HouseFly共享一个共同的松散解释的行为,即使它们在建模方面也不相同。因此,让我们创建一个可以实现的接口:

interface IPest {
    void BeAnnoying();
}

class HouseFly inherits Insect implements IPest {
    void FlyAroundYourHead(){}
    void LandOnThings(){}

    void BeAnnoying() {
        FlyAroundYourHead();
        LandOnThings();
    }
}

class Telemarketer inherits Person implements IPest {
    void CallDuringDinner(){}
    void ContinueTalkingWhenYouSayNo(){}

    void BeAnnoying() {
        CallDuringDinner();
        ContinueTalkingWhenYouSayNo();
    }
}

现在,我们有两个类,每个类都可能以自己的方式令人讨厌。而且他们不需要从相同的基类派生出来并共享共同的固有特性-他们只需要满足合同IPest-合同就是简单的。你只需要BeAnnoying。在这方面,我们可以建立以下模型:

class DiningRoom {

    DiningRoom(Person[] diningPeople, IPest[] pests) { ... }

    void ServeDinner() {
        when diningPeople are eating,

        foreach pest in pests
        pest.BeAnnoying();
    }
}

在这里,我们有一间餐厅,可以容纳许多食客和许多害虫-请注意该界面的使用。这意味着在我们的小世界中,pests数组的成员实际上可能是一个Telemarketer对象或一个HouseFly对象。

该ServeDinner方法在晚餐时供我们使用,而我们在饭厅里的人应该就餐。在我们的小游戏中,这是我们的害虫执行其工作的时候-指示每种害虫通过IPest界面来烦人。这样,我们可以轻松地同时拥有这两种方式,Telemarketers并且HouseFlys以各自的方式烦人-我们只在乎我们在DiningRoom物体中有某种东西是有害生物,我们并不真正在乎它是什么,它们可能什么也没有与其他共同。

这个非常人为的伪代码示例(比我预期的拖了更长的时间)仅是为了说明最终使我了解何时使用接口的那种事情。对于该示例的愚蠢行为,我事先表示歉意,但希望它对您的理解有所帮助。而且,可以肯定的是,您在此处收到的其他已发布答案确实涵盖了当今在html" target="_blank">设计模式和开发方法中使用接口的范围。



 类似资料:
  • 这点我见过提过几次,但我不清楚是甚么意思。你什么时候为什么要这么做? 我知道接口是做什么的,但我不清楚这一点的事实使我认为我错过了正确使用它们。 如果你要做: 您可以使用任何实现的类?你什么时候需要这么做?我唯一能想到的是,如果您有一个方法,但您不确定会传递什么对象,除了它实现。我想不出你需要多长时间这样做一次。 另外,如何编写一个方法来接受一个实现接口的对象呢?有可能吗?

  • 问题内容: 接口允许您创建定义实现它的类的方法的代码。但是,您不能向这些方法添加任何代码。 抽象类使您可以做同样的事情,并向方法中添加代码。 现在,如果您可以使用抽象类实现相同的目标,为什么我们甚至需要接口的概念? 有人告诉我,它与从C ++到Java的OO理论有关,这是PHP的OO东西所基于的。这个概念在Java中有用但在PHP中没有用吗?这只是一种避免在抽象类中乱扔占位符的方法吗?我想念什么吗

  • 问题内容: 在有效的Java书中,它指出: 语言规范保证,除非变量的类型或类型为[JLS,17.4.7],否则读写变量是原子的。 在Java编程或一般编程中,“原子”是什么意思? 问题答案: 这是一个示例,因为一个示例通常比冗长的解释更清晰。假设是类型为的变量。以下操作不是原子操作: 实际上,变量是使用两个单独的操作写入的:一个操作写入前32位,第二个操作写入后32位。这意味着另一个线程可能读取的

  • 在有效Java书中,它指出: 语言规范保证,除非变量类型为或[JLS,17.4.7],否则读取或写入变量是原子的。 在Java编程或一般编程的背景下,“原子”是什么意思?

  • 问题内容: 我正在阅读有关Java平台上的ployglot编程的TheServerSide文章。本文中的一些评论将元编程称为生成代码的能力(也许是在运行中)。 元编程是在运行时即时生成代码的能力,还是在运行时将方法和属性注入到现有对象中的能力(例如某些动态语言(如Python,Ruby和Groovy所允许的))。 问题答案: 元编程是指程序具有自身知识或可以操纵自身的多种方式。 在像C#这样的语言

  • # 11.1 接口是什么 Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。 通过如下格式定义接