调用2度以上的函数

时间:2014-09-28 23:11:24

标签: java c# oop methods call

我确信这是OOP中的经典案例,大多数程序员的答案都很简单,但我似乎没有在任何地方找到解释。 假设我有一个属于在类B中实例化的类A的方法,如下面的代码所示:

class A
{
    public void foo() {/*do something*/}
}       

class B
{
    public A objectA;

    public B()
    {
        objectA = new A();
    }

    public void call()
    {
        objectA.foo();
    }
}

现在假设我有一个实例化B类的第三个C(它依次使用上面的代码实例化A类):

class C
{
    public C()
   {
       objectB = new B();
   }
}

从C类调用函数foo()的最佳方法是什么(如果有的话):

objectB.call();

或者

objectB.objectA.foo();

我认为第一个选项在模块性方面可能是正确的答案,但如果B类永远不必调用foo(),它似乎是多余的。 这里有一个好的答案还是整个模式本身存在缺陷?如果是的话,它违反了哪些设计原则以及解决方法是什么?

3 个答案:

答案 0 :(得分:1)

在大多数情况下,objectA首先不应公开。考虑到它是B类的状态,我会说只有B及其子类应该能够直接使用它,所以我更喜欢第一个选项。

但是,如果它确实是公开的,那么它意味着外部类被认为具有足够的信息来直接操作它,或者它们可以在不改变B实例状态的情况下执行它。在那种必须罕见的情况下,第二种选择就可以了。

答案 1 :(得分:0)

如果objectA是真正公开的,那么任何一个都是可以接受的。 objectA受保护更为常见,而C

则无法使用

答案 2 :(得分:0)

根据Law of Demeter:“每个单位应该只与其朋友交谈;不要与陌生人交谈”,或者用另一种表述,“只与你的直接朋友交谈”。因此,上述第二种选择严格违反了这一原则。

话虽这么说,我觉得有必要在中间类中填充多个访问器方法,其唯一目的就是看远处的类并不是设计好的标志。