我需要知道这是否在正常的 OOP 行为中,或者如果不是,最常见的做法是什么(不是特定于某种语言)。
我在main上有一个类实例,名为 A ,里面已经将类 B 实例化为变量。当 A 调用 B 中的方法时, B 需要 A 中的某些方法才能正常工作。
为此,我必须通过参数绕过A引用本身,或者我必须始终使用特定于该语言的工具? OOP 给出了一些参考,或者它们的范围是什么?
谢谢。
答案 0 :(得分:0)
我在main上有一个类实例,名为A,里面有 将B类作为变量实例化。当A调用B,B内的方法时 需要A的一些方法来工作。
这里的问题是,你的A类知道得太多了 - 它知道如何用其参数实例化另一个类,因此它也负责factory责任。因此,您最终打破了Single-Responsibility Principle。
那么,让我们来看看你当前的类层次结构
class A
{
private b;
public void A()
{
b = new B();
}
}
a = new A();
由于您没有注入B
的实例,因此该实例也会绑定到类A
。
由于B
与A
紧密耦合,因此它非常难以进行单元测试(因为您无法注入B
的模拟实例),即您无法测试孤立的班级A
它引入了另一种形式的全局状态,因为B
来自全球范围
这样做的正确方法是(通过遵守Dependency Injection):
class A
{
private b;
public void A(B bInstance)
{
b = bInstance;
}
}
b = new B();
a = new A(b);