[Pas2js] Interface implementation idea

Michael Van Canneyt michael at freepascal.org
Wed Jan 17 20:19:56 CET 2018


A side remark,

Your mails are totally unreadable with a text mail client.
(see below)

Try sending mails to this list as plain text...

Thank you !

Michael.

On Wed, 17 Jan 2018, warleyalex via Pas2js wrote:

> 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 AsInterface and InterfaceAsClass functions.
> unit uAnimais;interfacetype  ISerVivo = interface    procedure Respira;
> procedure AlimentaSe;  end;  IAnimal = interface(ISerVivo)    procedure
> LocomoverSe;  end;  ICachorro = interface(IAnimal)    procedure Latir;  end;
> IBoi = interface(IAnimal)    procedure Mugir;  end;  TSerVivo = class
> abstract(ISerVivo)  public    procedure Respira; virtual; abstract;
> procedure AlimentaSe; virtual; abstract;  end;  TAnimal = class
> abstract(TSerVivo, IAnimal)  public    procedure LocomoverSe; virtual;
> abstract;  end;  TCachorro = class(TAnimal, ICachorro)  public
> //implementação de ISerVivo    procedure Respira;
> override;    procedure AlimentaSe;  override;
> //implementação de IAnimal    procedure LocomoverSe; override;
> //implementação de Icachorro    procedure Latir;    virtual;
> end;  TBoi = class(TAnimal, IBoi)  public    //implementação
> de ISerVivo    procedure Respira;     override;    procedure AlimentaSe;
> override;    //implementação de IAnimal    procedure
> LocomoverSe;  override;    //implementação de Iboi
> procedure Mugir;       virtual;  end;implementation{ TBoi }procedure
> TBoi.AlimentaSe;begin  console.log('Comendo Capim');end;procedure
> TBoi.LocomoverSe;begin  console.log('Boi Andando pesadamente');end;procedure
> TBoi.Mugir;begin  console.log('Muuuuuuuuuuuuuuuuuu');end;procedure
> TBoi.Respira;begin  console.log('Boi Respirando');end;{ TCachorro }procedure
> TCachorro.AlimentaSe;begin  console.log('Comendo
> Ração');end;procedure TCachorro.Latir;begin  console.log('Au
> Au');end;procedure TCachorro.LocomoverSe;begin  console.log('Cachorro
> Andando');end;procedure TCachorro.Respira;begin  console.log('Cachorro
> Respirando');end;end.{=====================================}/*  main entry
> point */var  boi: IBoi;  UmAnimal: IAnimal;  UmSerVivo: ISerVivo;begin  boi
> := TBoi.Create;  //boi is Ianimal and IServivo can be converted with "as"
> (boi as IServivo).AlimentaSe;  // Comendo Capim  (boi as
> IAnimal).LocomoverSe;  // Boi Andando pesadamente  //boi also can be
> converted directly  UmAnimal := boi;  UmSerVivo := boi;
> UmSerVivo.AlimentaSe;  // Comendo Capim  UmAnimal.LocomoverSe;  // Boi
> Andando pesadamente
> JavaScript emitted (output):
> var TObject={	$ClassName: "TObject",	$Parent: null,	ClassName: function (s)
> { return s.$ClassName },	ClassType: function (s) { return s },	ClassParent:
> function (s) { return s.$Parent },	$Init: function () {},	Create: function
> (s) { return s },	Destroy: function (s) { for (var prop in s) if
> (s.hasOwnProperty(prop)) delete s.prop },	Destroy$: function(s) { return
> s.ClassType.Destroy(s) },	Free: function (s) { if (s!==null)
> s.ClassType.Destroy(s) }}function $New(c) { var i={ClassType:c}; c.$Init(i);
> return i }function $Is(o,c) {	if (o===null) return false;	return
> $Inh(o.ClassType,c);};function InterfaceAsClass(i,c) {	if (i===null) return
> null;	if ($Is(i.O,c)) return i.O;	else throw
> Exception.Create($New(Exception),"Cannot cast interface of
> \""+i.O.ClassType.$ClassName+"\" to class \""+c.$ClassName+"\"");};function
> $Inh(s,c) {	if (s===null) return false;	while ((s)&&(s!==c))
> s=s.$Parent;	return (s)?true:false;};function AsInterface(o,i) {	if
> (o===null) return null;	var r = o.ClassType.Interface[i].map(function (e) {
> return function () {			var arg=Array.prototype.slice.call(arguments);
> arg.splice(0,0,o);			return e.apply(o, arg);		}	});	r.O = o;	return r;};///
> TSerVivo = class (TObject) file: uAnimaisvar TSerVivo = {
> $ClassName:"TSerVivo",$Parent:TObject   ,$Init:function ($) {
> TObject.$Init($); }   ,Destroy:TObject.Destroy
> ,Respira$:function($){return $.ClassType.Respira($)}
> ,AlimentaSe$:function($){return
> $.ClassType.AlimentaSe($)}};TSerVivo.Interface={
> ISerVivo:[TSerVivo.Respira,TSerVivo.AlimentaSe]}/// TAnimal = class
> (TSerVivo) file: uAnimaisvar TAnimal = {
> $ClassName:"TAnimal",$Parent:TSerVivo   ,$Init:function ($) {
> TSerVivo.$Init($);  }   ,Destroy:TObject.Destroy   ,Respira:TSerVivo.Respira
> ,AlimentaSe:TSerVivo.AlimentaSe   ,LocomoverSe$:function($){return
> $.ClassType.LocomoverSe($)}};TAnimal.Interface={    IAnimal:
> [TSerVivo.Respira,TSerVivo.AlimentaSe,TAnimal.LocomoverSe],	ISerVivo:
> [TSerVivo.Respira,TSerVivo.AlimentaSe]}/// TBoi = class (TAnimal) file:
> uAnimaisvar TBoi = {   $ClassName:"TBoi",$Parent:TAnimal   ,$Init:function
> ($) {  TAnimal.$Init($);   }   ,Respira:function(Self) { console.log("Boi
> Respirando"); }   ,AlimentaSe:function(Self) { console.log("Comendo Capim");
> }   ,LocomoverSe:function(Self) { console.log("Boi Andando pesadamente"); }
> ,Mugir:function(Self) { console.log("Muuuuuuuuuuuuuuuuuu"); }
> ,Destroy:TObject.Destroy   ,Respira$:function($){return
> $.ClassType.Respira($)}   ,AlimentaSe$:function($){return
> $.ClassType.AlimentaSe($)}   ,LocomoverSe$:function($){return
> $.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]}/*  main entry point */var
> boi = null;var UmAnimal = null;var UmSerVivo = null;boi =
> AsInterface(TObject.Create($New(TBoi)),"IBoi");AsInterface(InterfaceAsClass(boi,TObject),"ISerVivo")[1]();AsInterface(InterfaceAsClass(boi,TObject),"IAnimal")[2]();UmAnimal
> = boi;UmSerVivo = boi;UmSerVivo[1]();UmAnimal[2]();
>
>
>
>
> --
> Sent from: http://pas2js.38893.n8.nabble.com/


More information about the Pas2js mailing list