これは、タイプチェックのif-testまたはis-atestを使用せずにsmalltalkでどのように実行されますか?
例えば :
function Add( x, y : Integer ) : Integer;
begin
Add := x + y
end;
function Add( s, t : String ) : String;
begin
Add := Concat( s, t )
end;
これは、タイプチェックのif-testまたはis-atestを使用せずにsmalltalkでどのように実行されますか?
例えば :
function Add( x, y : Integer ) : Integer;
begin
Add := x + y
end;
function Add( s, t : String ) : String;
begin
Add := Concat( s, t )
end;
Smalltalkには、例のようなグローバルメソッドはありません。例を実装するには、メソッド#add:
を両方のクラスInteger
とString
クラス拡張として追加します。
Integer>>add: anInteger
^ self + anInteger
String>>add: aString
^ self , aString
次に、次のようなコードを記述できます。
1 add: 2. " -> 3 "
'foo' add: 'bar'. " -> 'foobar' "
メソッドの受信者に応じて適切なメソッドが呼び出されるため、if-testは必要ありませんadd:
。
Double Disptachを実装できます:
String>>add: other
^ self, other adaptToString
String>>adaptToString
^ self
Number>>adaptToString
^ self asString
Number>>add: other
^ self + other adaptToInteger
... and so on