我已经多次看到这句话,但我不清楚这是什么意思。

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

如果你这样做是不是就是这样:

IInterface classRef = new ObjectWhatever()

您可以使用任何实现的类IInterfaceIInterface

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

答案

对于这个问题,这里有一些精彩的答案,其中涉及到有关接口、松散耦合代码、控制反转等的各种详细信息。

当我第一次开始接触接口,我也困惑他们的相关性。较弱继承和思考的形式,“何必呢?”

例如,假设您有一个 SIM 游戏并具有以下类:

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

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

显然,这两个对象在直接继承方面没有任何共同点。

假设我们的游戏需要某种随机性事物 这会让玩家在吃晚饭时感到烦恼。HouseFly或一个Telemarketer或者两者兼而有之——但是如何通过一个函数同时实现这两种功能呢?

认识到的关键是,两者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如果物体是害虫,我们并不真正关心它是什么,它们可能与其他物体没有任何共同点。

这个非常做作的伪代码示例(比我预期的时间要长得多)只是为了说明最终让我明白什么时候我们可能会使用接口。

来自: stackoverflow.com