1

在 Kathy sierra 的“Head First Servlets and Jsp”一书中,第 744 页

上面提到,“当A类想使用B类中的方法时,一个很常见的做法是在两者之间创建一个接口。B类实现了这个接口后,A类就可以通过该接口使用B类了。”

我的问题是 A 类如何使用 B 类,因为它们可能通过实现相同的接口而具有相同的方法签名,但这些方法的实现会有所不同?有人可以解释一下吗?

4

4 回答 4

2

我认为有一点误解:A 和 B 不会都实现接口,我们称它为 C。只有 B 会实现 C。诀窍是现在 A 可以消除对 B 的所有直接引用而只使用 C,只要有一个A 可以通过某种方式获取实现 C 的对象,例如通过工厂。这样,您可以用完全不同的 C 实现替换 B,而不会破坏 A 中的代码。

于 2013-09-12T14:06:12.967 回答
2

接口是一组具有空主体的相关方法。

它更像是一份合同。当您拥有一台电视机时,按钮充当一个打开和关闭它的界面。这是您与电视之间的合同,您将使用这些界面来获得电视的最大收益。

例如,如果将自行车的行为指定为接口,则可能如下所示:

interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}

要实现这个接口,你的类的名字会改变(比如特定品牌的自行车,例如 ACMEBicycle),你可以在类声明中使用 implements 关键字:

class ACMEBicycle implements Bicycle {

    // remainder of this class 
    // implemented as before
}

希望这可以帮助。

于 2013-09-12T14:06:21.280 回答
1

松散耦合表示依赖关系,但不是显式引用。接口是一种通过提供独立于 a) 实现和 b) 继承树的成员声明来实现松散耦合的机制。

举个ClassA例子。ClassA实现接口IServiceMyMethod(ClassA input)依赖于ClassA.

MyMethod(IService input)依赖于IService但不依赖于ClassAMyMethod(IService)将编译没有ClassA- 它是松散耦合的。

综上所述。松散耦合允许两个组件参与一个机制,但它不会在它们之间进行显式引用。

于 2013-09-12T14:06:17.123 回答
1

一些示例代码(C#,但如果您了解 Java,应该可以理解):

// this interface defines what A should be able to do with B
interface SomeInterface
{
    int GetSomeValue();
}


// B needs to implement this interface
class B : SomeInterface
{
    int GetSomeValue()
    {
        return 42;
    }

    void SomeOtherMethod()
    {

    }
}

// A has access to B via the interface. Pass it in the constructor and save it for later use
class A
{
    A(SomeInterface si)
    {
        this.si = si;
    }
    SomeInterface si;

    // or pass it per call
    void SomeMethodInA(SomeInterface passedIF)
    {
        int c = passedIF.GetSomeValue();
    }

    // may even have the same name but doesn't have to!
    int GetSomeValue()
    {
        // access "B" (or some other class implementing this interface) via the interface
        return si.GetSomeValue() + 1;
    }


    // The interface can of course be also a property of A.
    // but this is left as an exercise to the reader

}


int main()
{
    B b = new B();
    A a = new A(b);
    a.GetSomeValue();
    a.SomeMethodInA(b);
}
于 2013-09-12T14:12:53.567 回答