这是一个循环依赖
Is this a cyclic dependency
class foo{
Bar b;
}
class bar{
Class clazz = foo.class;
}
上面的代码片段是否显示了循环依赖。 Class foo 引用了 bar class 对象。 Class bar 引用了 foo class 本身。
虽然根据您使用的语言,具体细节可能会略有不同,但在更纯粹的面向对象的术语中,不。
查看 Ruby 等受 Smalltalk 启发的语言可能会有所帮助,以了解情况如何:
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
有一个 bar instance
,而 bar instance
有一个 foo class
。在纯 OO 中,foo class
是 foo instances
的工厂,而 class 方法不能引用实例方法,但反之亦然,因此 foo instances
可以依赖于 foo class
但反之则不然。
所以在这个人为的例子中,foo instance
是依赖树的头部,而 foo class
是尾部。如果不是在 clazz 实例变量中引用 Foo class 你引用了一个 foo instance
你将有一个循环依赖图
class foo{
Bar b;
}
class bar{
Class clazz = foo.class;
}
上面的代码片段是否显示了循环依赖。 Class foo 引用了 bar class 对象。 Class bar 引用了 foo class 本身。
虽然根据您使用的语言,具体细节可能会略有不同,但在更纯粹的面向对象的术语中,不。
查看 Ruby 等受 Smalltalk 启发的语言可能会有所帮助,以了解情况如何:
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
有一个 bar instance
,而 bar instance
有一个 foo class
。在纯 OO 中,foo class
是 foo instances
的工厂,而 class 方法不能引用实例方法,但反之亦然,因此 foo instances
可以依赖于 foo class
但反之则不然。
所以在这个人为的例子中,foo instance
是依赖树的头部,而 foo class
是尾部。如果不是在 clazz 实例变量中引用 Foo class 你引用了一个 foo instance
你将有一个循环依赖图