究竟是什么意思,一个班级对另一个人的了解太多了?
class AAA {
public void method1() {
//do something
method2();
}
public void method2();
// do something
}
}
class BBB {
private AAA ref = new AAA();
public void start() {
while(true) {
if (something) {
ref.method1();
}
}
}
}
class Main {
public static void main(String[] args) {
BBB ref = new BBB();
ref.start();
}
}
在文件中它说
>主要课程取决于BBB
> BBB取决于AAA
提出的问题是
> BBB需要依赖AAA吗?
> BBB是否可以在新环境中重复使用?
关于2. – 是吗?如果没有,为什么不呢?为什么依赖于AAA会阻止它在新的上下文中使用?这里的语境是否意味着“有不同的阶级”?
它说虽然BBB需要调用method1(),但它不需要知道该方法的作用.因此,您应该通过使用AAA的接口/抽象类而不是AAA本身来削弱依赖性(松散耦合)
新的:
class AAA extends AbstractAAA {
// same
}
class BBB {
AbstractAAA ref;
public BBB (AbstractAAA param) {
this.ref = param;
}
public void start() {
while(true) {
if (something) {
ref.method1();
}
}
}
}
class Main {
BBB ref = new BBB(new AAA());
ref.start();
}
现在它说main仍然依赖于BBB,它取决于AAA的构造函数,但BBB不受AAA的实现细节的影响.
依赖意味着最广泛意义上的“使用一个实例”,所以我看到主要依赖于BBB,而AAA和BBB以前依赖于AAA而现在依赖于抽象类,这是一个较弱的依赖.
我没有得到的问题是依赖关系和实现细节究竟是什么问题,如果另一个类发生了变化则不得不改变.我认为最好使用接口和抽象类作为方法和构造函数的参数,因为你可以传递任何类扩展/实现类/接口.
但有实施细节的事情.当我有一个类的引用(并创建一个依赖项)并调用一个公共方法时,我如何依赖于实现细节?仅仅因为我称这种方法并不意味着我知道它内部发生了什么……?
我在这里看了其他的例子,但我还是没有真正得到它……