这是一个循环依赖

时间:2018-04-19 15:38:20

标签: design-patterns object-oriented-analysis cyclic-dependency

class foo{
Bar b;
}

class bar{
Class clazz = foo.class;
}

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

1 个答案:

答案 0 :(得分:1)

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

查看像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 instancebar instance有一个foo class。在纯OO中,foo classfoo instances的工厂,类方法不能引用实例方法,但反之亦然,因此foo instances可以依赖于foo class但不是foo instance反过来说。

所以在这个人为的例子中,foo class是依赖树的头部,而foo instance是尾部。如果不是在clazz实例变量中引用Foo类而引用了{{1}},那么您将拥有循环依赖图