0
class foo{
Bar b;
}

class bar{
Class clazz = foo.class;
}

上面的代码片段是否显示了循环依赖。类 foo 具有 bar 类对象的引用。类 bar 引用了 foo 类本身。

4

1 回答 1

1

虽然具体取决于您使用的语言,但在更纯粹的面向对象的术语中可能会略有不同。

查看受 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 instancehas-abar instance和一个bar instancehas-a foo class。在纯 OO 中,afoo class是 的工厂foo instances,类方法不能引用实例方法,但反之亦然,因此foo instances可以依赖foo class但不能反过来。

所以在这个人为的例子中,foo instance是依赖树的头部,foo class而是尾部。如果不是在 clazz 实例变量中引用 Foo 类,而是引用 afoo instance你将有一个循环依赖图

于 2018-04-19T18:18:42.590 回答