<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/>