什么是级联和链式的区别?

6

我在一个论坛上了解到关于级联的信息。问题是在面向对象编程中级联的含义是什么。我试图在谷歌上找到答案,也尝试在stackoverflow的一些帖子中找到答案,但是没有成功。我只找到了这个链接http://en.wikipedia.org/wiki/Method_cascading

我知道什么是链式调用,我经常在JavaScript、jQuery和其他编程语言中使用它,但我无法理解链式调用和级联之间的区别。有人可以帮助我吗?或者有人可以提供一些有关此问题的有用链接吗?


1
https://en.wikipedia.org/wiki/Method_cascading#Comparison_with_method_chaining - Oliver Charlesworth
是的,我指的是面向对象编程,抱歉。 - dan89
2个回答

4
在您提供的维基百科页面上,定义已经很清晰明了:
给定一个方法调用a.b(),在执行该调用后,方法级联将此表达式评估为左侧对象a(带有其新值,如果已更改),而方法链接将此表达式评估为右侧对象。
这意味着,使用方法级联,a.b()返回一个已变异的a实例。使用方法链接,a.b()与b()返回不同的结果。
因此,这就是方法级联:
class YourClass {
    public YourClass b() {
        // do stuff
        return this;
    }

    public YourClass c() {
        // do stuff
        return this;
    }
}

..这使得你可以使用yourClass.b().c();进行操作。

..这就是方法链:

class YourClass {
    public SomeOtherObject b() {
        // do stuff
        return new SomeOtherObject(this);
    }
}

class SomeOtherObject {
    private YourClass _owner;

    public SomeOtherObject(YourClass owner) {
        _owner = owner;
    }

    public void c_onOtherObject() {
    }
}

这段代码允许您使用yourClass.b().c_onOtherObject();语法。

编辑:我撤销了之前的编辑。上面的代码是正确的,术语没有错误地颠倒。


4

链接是指将方法调用的结果返回以在下一次调用中使用。

C#

Enumerable.Range(0,10).Skip(1).Aggregate(myList.First(),(result,listItem) => result += listItem));
//results in 45 being returned

层叠可以通过使用链接实现,当返回this时(有时很难区分两者)。jQuery就是这样做的。
jQuery
$("#myId").css("background-color","blue").fadeIn().fadeOut();
//results in $("#myId") being returned

2
嗯..看起来我们的定义出现了问题。我对那篇维基百科文章的理解不同。我个人一直将其称为“链式调用”。 - Simon Whitehead
我同意,那看起来有点不对劲... - Kevin B
@SimonWhitehead - 我一开始的解释不够清晰,我认为你在帖子中并没有错误。请查看我的编辑。 - Travis J
方法链的解释可以在这个页面上找到更详细的说明:http://en.wikipedia.org/wiki/Method_chaining。 - Kevin B
2
由于链式编程在面向对象语言中被广泛实现,而级联则不是,因此这种“通过返回this进行级联的链式编程”形式通常被简称为“链式编程”。哈哈哈。 - Kevin B
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接