1

在不使用 if-test 或 is-a 测试进行类型检查的情况下,这如何在 smalltalk 中完成?

例如 :

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

function Add( s, t : String ) : String;
begin
    Add := Concat( s, t )
end;
4

2 回答 2

12

Smalltalk 没有您的示例中的全局方法。要实现您的示例,您可以将该方法添加#add:到两个类IntegerString作为类扩展:

Integer>>add: anInteger
  ^ self + anInteger

String>>add: aString
  ^ self , aString

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

1 add: 2.                 " -> 3 " 
'foo' add: 'bar'.         " -> 'foobar' "

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

于 2013-01-11T10:18:03.397 回答
3

您可以实现Double Disptach

String>>add: other
    ^ self, other adaptToString

String>>adaptToString
    ^ self

Number>>adaptToString
    ^ self asString

Number>>add: other
    ^ self + other adaptToInteger

... and so on
于 2013-01-11T10:15:48.897 回答