smalltalk中的ad hoc多态性

Jer*_*ees 1 smalltalk

如果不使用if-test或者是针对类型检查的测试,如何在smalltalk中完成?

例如 :

function Add( x, y : Integer ) : Integer;
begin
    Add := x + y
end;

function Add( s, t : String ) : String;
begin
    Add := Concat( s, t )
end;
Run Code Online (Sandbox Code Playgroud)

Luk*_*gli 12

Smalltalk没有像您的示例中那样的全局方法.要实现您的示例,您可以将方法添加#add:到两个类IntegerString类扩展:

Integer>>add: anInteger
  ^ self + anInteger

String>>add: aString
  ^ self , aString
Run Code Online (Sandbox Code Playgroud)

然后你可以编写如下代码:

1 add: 2.                 " -> 3 " 
'foo' add: 'bar'.         " -> 'foobar' "
Run Code Online (Sandbox Code Playgroud)

不需要if-test,因为根据方法的接收者调用正确的方法add:.