OO语言中方法调用的不同语法

时间:2009-11-07 02:35:53

标签: language-agnostic oop syntax

我知道:

C ++,Java和其他人:

object.method() , object.method(arg)  

目标-C:

[object method] , [object method:arg]

Smalltalk中:

object method   , object method: arg

PHP,Perl

object->method(), object->method(arg)
$object->method;
$object->method($arg1, $arg2, ...);

OCaml的

object#method  ,  object#method args

CLOS

(method object) ,  (method object arg) 

甚至,我使用过:

method object
method(object)

您可以在不同的编程语言中为向对象发送消息(我认为这是正确的术语)的其他替代方法命名吗?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

最有趣的可能是“通用函数”表示法 - 在CLOS(Common Lisp的OO部分)中,它们被称为(method object arg)defgeneric用于{{1} }}作为泛型函数,method定义其特化/覆盖);在更加面向代数表示法的语言中,如Dylan和Python(例如PEAK),调用将更像defmethod

关于通用/方法方法(Common Lisp开创性的AFAIK)最酷的事情是它不会 以不同于所有其他方式处理第一个对象 - 方法调度可能发生在任何参数'运行时类型的组合,而不仅仅是参数的一个的运行时类型(单参数调度显然作为特殊情况涵盖;-)。告别Visitor和所有其他变体(例如this paper),它们基本上尝试模拟单调度语言中的多个调度! - )

答案 2 :(得分:1)

为了完整起见:

虽然VB.NET通常使用与C#相同的样式,但是也可以省略方法和无参数函数/构造函数的括号:

stream.WriteLine "Hello"
Dim x = stream.ReadLine

但IDE会自动为参数化方法调用添加括号(奇怪的是,对于函数和构造函数,它不会做同样的事情)。

此外,VB.NET仍然知道(有些古老的)Call关键字,它再次强制围绕参数化方法调用的括号:

Call stream.WriteLine("Hello") '// is the same as'
stream.WriteLine("Hello")
'// This won’t compile:'
Call stream.WriteLine "Hello"

答案 3 :(得分:1)

在Perl中,它的:

$object->method;
$object->method($arg1, $arg2, ...);

和潜在危险的间接对象语法(如果你在当前范围内有一个子命名方法,它将不起作用:

method $object $arg1, $arg2...;

答案 4 :(得分:0)

继Alex Martelli的评论之后,JVM语言中的多种方法很好

FiniteStateMachineMultiMethodExample

VisitorPatternMultiMethodExample

other examples