Respond to an unknown method call: Difference between revisions
→{{header|Object Pascal}}: complete replacement of the example
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
(→{{header|Object Pascal}}: complete replacement of the example) |
||
Line 891:
=={{header|Object Pascal}}==
Works with FPC(tested with version 3.2.2).
The example uses the late binding mechanism provided by custom variants. This will require some boilerplate code that needs to be placed in a separate unit:
<syntaxhighlight lang="pascal">▼
unit MyObjDef;
{$mode objfpc}{$h+}
interface
uses
SysUtils, Variants;
function MyObjCreate: Variant;
▲<syntaxhighlight lang="pascal">
type▼
end;▼
implementation
var
MyObjType: TInvokeableVariantType;
▲type
TMyObjType = class(TInvokeableVariantType)
procedure Clear(var V: TVarData); override;
procedure Copy(var aDst: TVarData; const aSrc: TVarData; const Indir: Boolean); override;
function GetProperty(var aDst: TVarData; const aData: TVarData; const aName: string): Boolean; override;
▲ end;
function MyObjCreate: Variant;
begin
Result := Unassigned;
TVarData(Result).VType := MyObjType.VarType;
end;
procedure TMyObjType.Clear(var V: TVarData);
begin
V.VType := varEmpty;
end;
procedure TMyObjType.Copy(var aDst: TVarData; const aSrc: TVarData; const Indir: Boolean);
begin
VarClear(Variant(aDst));
aDst := aSrc;
end;
function TMyObjType.GetProperty(var aDst: TVarData; const aData: TVarData; const aName: string): Boolean;
begin
Result := True;
case LowerCase(aName) of
'bark': Variant(aDst) := 'WOF WOF!';
'moo': Variant(aDst) := 'Mooo!';
else
Variant(aDst) := Format('Sorry, what is "%s"?', [aName]);
end;
end;
initialization
finalization
end.
</syntaxhighlight>
And main program:
▲ animal := Tanimal.Create;
<syntaxhighlight lang="pascal">
program Test;
▲ animal.Free;
{$mode objfpc}{$h+}
uses
MyObjDef;
var
MyObj: Variant;
begin
MyObj := MyObjCreate;
WriteLn(MyObj.Bark);
WriteLn(MyObj.Moo);
WriteLn(MyObj.Meow);
end.
</syntaxhighlight>
{{out}}
<pre>
WOF WOF!
Mooo!
Sorry, what is "Meow"?
</pre>
=={{header|Objective-C}}==
|