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

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

如果要这样做,是这样吗?

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(){}
}


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

假设我们的游戏需要某种随机的东西,使玩家在吃晚餐时会感到烦恼。这可以是HouseFlyTelemarketer或两者都有-但是如何通过一个功能同时允许这两个?您又如何要求每种不同类型的对象以相同的方式“做他们烦人的事”?

要实现的关键是,尽管TelemarketerHouseFly在建模方面并不相同,但它们都具有共同的松散解释行为。因此,让我们创建一个可以实现的接口:

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界面指示每种害虫都令人讨厌。这样,我们就可以很容易地使TelemarketersHouseFlys都以其各自的方式烦人-我们只关心DiningRoom对象中是否有某种有害生物,我们不在乎是什么,他们可能没有其他共同点。

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

10-05 20:48
查看更多