在Kathy sierra的“Head First Servlets and Jsp”一书中,第744页
提到, “当A类想要在B类中使用方法时,一种非常常见的方法是在两者之间创建一个接口。一旦B类实现了这个接口,A类就可以通过接口使用B类。”
我的问题是A类如何使用B类,因为它们可能通过实现相同的接口具有相同的方法签名,但这些方法的实现会有所不同? 有人可以解释一下吗?
答案 0 :(得分:2)
我认为存在轻微的误解: A和B都不会实现接口,让我们称之为C.只有B会实现C.诀窍是现在A可以消除对B的所有直接引用并且只使用C,前提是A有一种方式可以以某种方式获得一个实现C的对象,例如通过工厂。这样你可以用完全不同的C实现替换B而不破坏A中的代码。
答案 1 :(得分:2)
An interface是一组带有空体的相关方法。
这更像是合同。当你有一台电视机时, 按钮充当n接口,可以将其打开并关闭。那 是您和将要使用的电视之间的合同 那些接口可以最大限度地发挥电视的作用。
例如,自行车的行为(如果指定为界面)可能如下所示:
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
}
希望这有帮助。
答案 2 :(得分:1)
松散耦合表示依赖关系,但不是显式引用。接口是一种通过独立于a)实现和b)继承树提供成员声明来实现松散耦合的机制。
以ClassA
为例。 ClassA
实现了接口IService
。
MyMethod(ClassA input)
依赖于ClassA
。
MyMethod(IService input)
取决于IService
,但不取决于ClassA
。 <{1}}将在没有MyMethod(IService)
的情况下进行编译 - 它是松散耦合的。
总之。松散耦合允许两个组件参与机制,但它们之间没有明确的引用。
答案 3 :(得分: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);
}