<p>Since Pas2JS does not have support for Interface yet. At the moment, I'm having a look for alternatives, the DWScript supports interface directly, the compiler emittes <span style="text-decoration: underline;">AsInterface</span> and <span style="text-decoration: underline;">InterfaceAsClass</span> functions.</p>
<!-- HTML generated using hilite.me -->
<div style="background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;">
<pre style="margin: 0; line-height: 125%;"><span style="color: #008800; font-weight: bold;">unit</span> uAnimais<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">interface</span>
<span style="color: #008800; font-weight: bold;">type</span>
ISerVivo <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">interface</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
IAnimal <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">interface</span>(ISerVivo)
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
ICachorro <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">interface</span>(IAnimal)
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Latir</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
IBoi <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">interface</span>(IAnimal)
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Mugir</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
TSerVivo <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #003388; font-weight: bold;">abstract</span>(ISerVivo)
<span style="color: #003388; font-weight: bold;">public</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">virtual</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">abstract</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">virtual</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">abstract</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
TAnimal <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">class</span> <span style="color: #003388; font-weight: bold;">abstract</span>(TSerVivo<span style="color: #333333;">,</span> IAnimal)
<span style="color: #003388; font-weight: bold;">public</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">virtual</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">abstract</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
TCachorro <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">class</span>(TAnimal<span style="color: #333333;">,</span> ICachorro)
<span style="color: #003388; font-weight: bold;">public</span>
<span style="color: #888888;">//implementação de ISerVivo</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #888888;">//implementação de IAnimal</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #888888;">//implementação de Icachorro</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Latir</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">virtual</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
TBoi <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">class</span>(TAnimal<span style="color: #333333;">,</span> IBoi)
<span style="color: #003388; font-weight: bold;">public</span>
<span style="color: #888888;">//implementação de ISerVivo</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #888888;">//implementação de IAnimal</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">override</span><span style="color: #333333;">;</span>
<span style="color: #888888;">//implementação de Iboi</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #0066bb; font-weight: bold;">Mugir</span><span style="color: #333333;">;</span> <span style="color: #003388; font-weight: bold;">virtual</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">implementation</span>
<span style="color: #888888;">{ TBoi }</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TBoi</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Comendo Capim'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TBoi</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Boi Andando pesadamente'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TBoi</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">Mugir</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Muuuuuuuuuuuuuuuuuu'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TBoi</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Boi Respirando'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #888888;">{ TCachorro }</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TCachorro</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">AlimentaSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Comendo Ração'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TCachorro</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">Latir</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Au Au'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TCachorro</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">LocomoverSe</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Cachorro Andando'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">procedure</span> <span style="color: #bb0066; font-weight: bold;">TCachorro</span><span style="color: #333333;">.</span><span style="color: #0066bb; font-weight: bold;">Respira</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
console<span style="color: #333333;">.</span>log(<span style="background-color: #fff0f0;">'Cachorro Respirando'</span>)<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">end</span><span style="color: #333333;">.</span>
<span style="color: #888888;">{=====================================}</span>
<span style="color: #333333;">/*</span> main entry point <span style="color: #333333;">*/</span>
<span style="color: #008800; font-weight: bold;">var</span>
boi<span style="color: #333333;">:</span> IBoi<span style="color: #333333;">;</span>
UmAnimal<span style="color: #333333;">:</span> IAnimal<span style="color: #333333;">;</span>
UmSerVivo<span style="color: #333333;">:</span> ISerVivo<span style="color: #333333;">;</span>
<span style="color: #008800; font-weight: bold;">begin</span>
boi <span style="color: #333333;">:=</span> TBoi<span style="color: #333333;">.</span>Create<span style="color: #333333;">;</span>
<span style="color: #888888;">//boi is Ianimal and IServivo can be converted with "as"</span>
(boi <span style="color: #008800; font-weight: bold;">as</span> IServivo)<span style="color: #333333;">.</span>AlimentaSe<span style="color: #333333;">;</span> <span style="color: #888888;">// Comendo Capim</span>
(boi <span style="color: #008800; font-weight: bold;">as</span> IAnimal)<span style="color: #333333;">.</span>LocomoverSe<span style="color: #333333;">;</span> <span style="color: #888888;">// Boi Andando pesadamente</span>
<span style="color: #888888;">//boi also can be converted directly</span>
UmAnimal <span style="color: #333333;">:=</span> boi<span style="color: #333333;">;</span>
UmSerVivo <span style="color: #333333;">:=</span> boi<span style="color: #333333;">;</span>
UmSerVivo<span style="color: #333333;">.</span>AlimentaSe<span style="color: #333333;">;</span> <span style="color: #888888;">// Comendo Capim</span>
UmAnimal<span style="color: #333333;">.</span>LocomoverSe<span style="color: #333333;">;</span> <span style="color: #888888;">// Boi Andando pesadamente</span>
</pre>
</div>
<p><strong>JavaScript emitted (output):</strong></p>
<div style="background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;">
<pre style="margin: 0; line-height: 125%;"><span style="color: #000080; font-weight: bold;">var</span> TObject={
$ClassName: <span style="color: #0000ff;">"TObject"</span>,
$Parent: <span style="color: #000080; font-weight: bold;">null</span>,
ClassName: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">return</span> s.$ClassName },
ClassType: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">return</span> s },
ClassParent: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">return</span> s.$Parent },
$Init: <span style="color: #000080; font-weight: bold;">function</span> () {},
Create: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">return</span> s },
Destroy: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">for</span> (<span style="color: #000080; font-weight: bold;">var</span> prop <span style="color: #000080; font-weight: bold;">in</span> s) <span style="color: #000080; font-weight: bold;">if</span> (s.hasOwnProperty(prop)) <span style="color: #000080; font-weight: bold;">delete</span> s.prop },
Destroy$: <span style="color: #000080; font-weight: bold;">function</span>(s) { <span style="color: #000080; font-weight: bold;">return</span> s.ClassType.Destroy(s) },
Free: <span style="color: #000080; font-weight: bold;">function</span> (s) { <span style="color: #000080; font-weight: bold;">if</span> (s!==<span style="color: #000080; font-weight: bold;">null</span>) s.ClassType.Destroy(s) }
}
<span style="color: #000080; font-weight: bold;">function</span> $New(c) { <span style="color: #000080; font-weight: bold;">var</span> i={ClassType:c}; c.$Init(i); <span style="color: #000080; font-weight: bold;">return</span> i }
<span style="color: #000080; font-weight: bold;">function</span> $Is(o,c) {
<span style="color: #000080; font-weight: bold;">if</span> (o===<span style="color: #000080; font-weight: bold;">null</span>) <span style="color: #000080; font-weight: bold;">return</span> <span style="color: #000080; font-weight: bold;">false</span>;
<span style="color: #000080; font-weight: bold;">return</span> $Inh(o.ClassType,c);
};
<span style="color: #000080; font-weight: bold;">function</span> InterfaceAsClass(i,c) {
<span style="color: #000080; font-weight: bold;">if</span> (i===<span style="color: #000080; font-weight: bold;">null</span>) <span style="color: #000080; font-weight: bold;">return</span> <span style="color: #000080; font-weight: bold;">null</span>;
<span style="color: #000080; font-weight: bold;">if</span> ($Is(i.O,c)) <span style="color: #000080; font-weight: bold;">return</span> i.O;
<span style="color: #000080; font-weight: bold;">else</span> <span style="color: #000080; font-weight: bold;">throw</span> Exception.Create($New(Exception),<span style="color: #0000ff;">"Cannot cast interface of \""</span>+i.O.ClassType.$ClassName+<span style="color: #0000ff;">"\" to class \""</span>+c.$ClassName+<span style="color: #0000ff;">"\""</span>);
};
<span style="color: #000080; font-weight: bold;">function</span> $Inh(s,c) {
<span style="color: #000080; font-weight: bold;">if</span> (s===<span style="color: #000080; font-weight: bold;">null</span>) <span style="color: #000080; font-weight: bold;">return</span> <span style="color: #000080; font-weight: bold;">false</span>;
<span style="color: #000080; font-weight: bold;">while</span> ((s)&&(s!==c)) s=s.$Parent;
<span style="color: #000080; font-weight: bold;">return</span> (s)?<span style="color: #000080; font-weight: bold;">true</span>:<span style="color: #000080; font-weight: bold;">false</span>;
};
<span style="color: #000080; font-weight: bold;">function</span> AsInterface(o,i) {
<span style="color: #000080; font-weight: bold;">if</span> (o===<span style="color: #000080; font-weight: bold;">null</span>) <span style="color: #000080; font-weight: bold;">return</span> <span style="color: #000080; font-weight: bold;">null</span>;
<span style="color: #000080; font-weight: bold;">var</span> r = o.ClassType.Interface[i].map(<span style="color: #000080; font-weight: bold;">function</span> (e) {
<span style="color: #000080; font-weight: bold;">return</span> <span style="color: #000080; font-weight: bold;">function</span> () {
<span style="color: #000080; font-weight: bold;">var</span> arg=Array.prototype.slice.call(arguments);
arg.splice(<span style="color: #0000ff;">0</span>,<span style="color: #0000ff;">0</span>,o);
<span style="color: #000080; font-weight: bold;">return</span> e.apply(o, arg);
}
});
r.O = o;
<span style="color: #000080; font-weight: bold;">return</span> r;
};
<span style="color: #008800; font-style: italic;">/// TSerVivo = class (TObject) file: uAnimais</span>
<span style="color: #000080; font-weight: bold;">var</span> TSerVivo = {
$ClassName:<span style="color: #0000ff;">"TSerVivo"</span>,$Parent:TObject
,$Init:<span style="color: #000080; font-weight: bold;">function</span> ($) { TObject.$Init($); }
,Destroy:TObject.Destroy
,Respira$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.Respira($)}
,AlimentaSe$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.AlimentaSe($)}
};
TSerVivo.Interface={
ISerVivo:[TSerVivo.Respira,TSerVivo.AlimentaSe]
}
<span style="color: #008800; font-style: italic;">/// TAnimal = class (TSerVivo) file: uAnimais</span>
<span style="color: #000080; font-weight: bold;">var</span> TAnimal = {
$ClassName:<span style="color: #0000ff;">"TAnimal"</span>,$Parent:TSerVivo
,$Init:<span style="color: #000080; font-weight: bold;">function</span> ($) { TSerVivo.$Init($); }
,Destroy:TObject.Destroy
,Respira:TSerVivo.Respira
,AlimentaSe:TSerVivo.AlimentaSe
,LocomoverSe$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.LocomoverSe($)}
};
TAnimal.Interface={
IAnimal: [TSerVivo.Respira,TSerVivo.AlimentaSe,TAnimal.LocomoverSe],
ISerVivo: [TSerVivo.Respira,TSerVivo.AlimentaSe]
}
<span style="color: #008800; font-style: italic;">/// TBoi = class (TAnimal) file: uAnimais</span>
<span style="color: #000080; font-weight: bold;">var</span> TBoi = {
$ClassName:<span style="color: #0000ff;">"TBoi"</span>,$Parent:TAnimal
,$Init:<span style="color: #000080; font-weight: bold;">function</span> ($) { TAnimal.$Init($); }
,Respira:<span style="color: #000080; font-weight: bold;">function</span>(Self) { console.log(<span style="color: #0000ff;">"Boi Respirando"</span>); }
,AlimentaSe:<span style="color: #000080; font-weight: bold;">function</span>(Self) { console.log(<span style="color: #0000ff;">"Comendo Capim"</span>); }
,LocomoverSe:<span style="color: #000080; font-weight: bold;">function</span>(Self) { console.log(<span style="color: #0000ff;">"Boi Andando pesadamente"</span>); }
,Mugir:<span style="color: #000080; font-weight: bold;">function</span>(Self) { console.log(<span style="color: #0000ff;">"Muuuuuuuuuuuuuuuuuu"</span>); }
,Destroy:TObject.Destroy
,Respira$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.Respira($)}
,AlimentaSe$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.AlimentaSe($)}
,LocomoverSe$:<span style="color: #000080; font-weight: bold;">function</span>($){<span style="color: #000080; font-weight: bold;">return</span> $.ClassType.LocomoverSe($)}
};
TBoi.Interface={
ISerVivo: [TBoi.Respira,TBoi.AlimentaSe],
IBoi: [TBoi.Respira,TBoi.AlimentaSe,TBoi.LocomoverSe,TBoi.Mugir],
IAnimal: [TBoi.Respira,TBoi.AlimentaSe,TBoi.LocomoverSe]
}
<span style="color: #008800; font-style: italic;">/* main entry point */</span>
<span style="color: #000080; font-weight: bold;">var</span> boi = <span style="color: #000080; font-weight: bold;">null</span>;
<span style="color: #000080; font-weight: bold;">var</span> UmAnimal = <span style="color: #000080; font-weight: bold;">null</span>;
<span style="color: #000080; font-weight: bold;">var</span> UmSerVivo = <span style="color: #000080; font-weight: bold;">null</span>;
boi = AsInterface(TObject.Create($New(TBoi)),<span style="color: #0000ff;">"IBoi"</span>);
AsInterface(InterfaceAsClass(boi,TObject),<span style="color: #0000ff;">"ISerVivo"</span>)[<span style="color: #0000ff;">1</span>]();
AsInterface(InterfaceAsClass(boi,TObject),<span style="color: #0000ff;">"IAnimal"</span>)[<span style="color: #0000ff;">2</span>]();
UmAnimal = boi;
UmSerVivo = boi;
UmSerVivo[<span style="color: #0000ff;">1</span>]();
UmAnimal[<span style="color: #0000ff;">2</span>]();
</pre>
</div>
<br/><hr align="left" width="300" />
Sent from the <a href="http://pas2js.38893.n8.nabble.com/">PAS2JS mailing list archive</a> at Nabble.com.<br/>