class foo{
Bar b;
}
class bar{
Class clazz = foo.class;
}
上面的代码片段是否显示了循环依赖。类 foo 具有 bar 类对象的引用。类 bar 引用了 foo 类本身。
class foo{
Bar b;
}
class bar{
Class clazz = foo.class;
}
上面的代码片段是否显示了循环依赖。类 foo 具有 bar 类对象的引用。类 bar 引用了 foo 类本身。
虽然具体取决于您使用的语言,但在更纯粹的面向对象的术语中可能会略有不同。
查看受 Smalltalk 启发的语言(如 Ruby)会有所帮助,以了解情况如何:
class Foo
def initialize()
@b = Bar.new()
end
def what_is_b() # instance method can call class method who
@b.who()
end
def who()
"foo instance"
end
def self.who() # class method can't call instance method what_is_b
"foo class"
end
end
class Bar
def initialize()
@clazz = Foo
end
def what_is_clazz()
@clazz.who()
end
def who()
"bar instance"
end
def self.who()
"bar class"
end
end
f = Foo.new()
puts f.who()
puts f.what_is_b()
puts " and "
b = Bar.new()
puts b.who()
puts b.what_is_clazz()
这输出:
foo instance
bar instance
and
bar instance
foo class
这表明一个foo instance
has-abar instance
和一个bar instance
has-a foo class
。在纯 OO 中,afoo class
是 的工厂foo instances
,类方法不能引用实例方法,但反之亦然,因此foo instances
可以依赖foo class
但不能反过来。
所以在这个人为的例子中,foo instance
是依赖树的头部,foo class
而是尾部。如果不是在 clazz 实例变量中引用 Foo 类,而是引用 afoo instance
你将有一个循环依赖图