Smart pascal source code
type
TMyClass = class
class procedure WriteLnMyName;
class function GetMyName : String; virtual;
end;
type
TMyOtherClass = class (TMyClass)
class procedure WriteLnMyName;
class function GetMyName : String; override;
end;
class procedure TMyClass.WriteLnMyName;
begin
WriteLn('TMyClass');
end;
class function TMyClass.GetMyName : String;
begin
Result:='This is TMyClass';
end;
class procedure TMyOtherClass.WriteLnMyName;
begin
WriteLn('TMyOtherClass');
end;
class function TMyOtherClass.GetMyName : String;
begin
Result:='I''m TMyOtherClass';
end;
type
TClassB = class
class procedure ClassProc;
method DoIt;
end;
class procedure TClassB.ClassProc;
begin
WriteLn(ClassName+' ClassProc');
end;
method TClassB.DoIt;
begin
ClassProc;
Self.ClassProc;
end;
type
TBase = class
class method Test; virtual;
class method Test2;
class method CallVirtual; virtual;
class method Call;
end;
type
TChild = class(TBase)
class method CallVirtual; override;
end;
class method TBase.Test;
begin
WriteLn('test '+ClassName);
end;
class method TBase.Test2;
begin
WriteLn('test2 '+ClassName);
end;
class method TBase.CallVirtual;
begin
Test;
Test2;
end;
class method TBase.Call;
begin
Test;
Test2;
end;
class method TChild.CallVirtual;
begin
WriteLn('overridden');
inherited CallVirtual;
end;
var
my : TMyClass;
myo : TMyOtherClass;
b := TClassB.Create;
c : TChild := new TChild;
d : TClass := TObject.ClassType;
Begin
TMyClass.WriteLnMyName;
TMyOtherClass.WriteLnMyName;
WriteLn(TMyClass.GetMyName);
WriteLn(TMyOtherClass.GetMyName);
my:=TMyClass.Create;
my.WriteLnMyName;
WriteLn(my.GetMyName);
my:=TMyOtherClass.Create;
my.WriteLnMyName;
WriteLn(my.GetMyName);
myo:=TMyOtherClass.Create;
myo.WriteLnMyName;
WriteLn(myo.GetMyName);
myo:=nil;
try
myo.WriteLnMyName;
except
on E: Exception do
WriteLn(e.Message);
end;
b.ClassProc;
TClassB.ClassProc;
b.DoIt;
c.Test;
TChild.Test;
c.Test2;
TChild.Test2;
c.Call;
c.CallVirtual;
TChild.Call;
TChild.CallVirtual;
WriteLn(TClass.ClassName);
WriteLn(TClass.ClassType.ClassName);
WriteLn(d.ClassName);
WriteLn(d.ClassType.ClassName);
var Exception={
$ClassName: "Exception",
$Parent: TObject,
$Init: function () { FMessage="" },
Create: function (s,Msg) { s.FMessage=Msg; return s }
}
function $W(e) { return e.ClassType?e:Exception.Create($New(Exception),e.constructor.name+", "+e.message) }
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 $Inh(s,c) {
if (s===null) return false;
while ((s)&&(s!==c)) s=s.$Parent;
return (s)?true:false;
};
var my = null;
var myo = null;
var b = null,
b = TObject.Create($New(TClassB));
var c = null,
c = TObject.Create($New(TChild));
var d = null,
d = TObject.ClassType(TObject);
TMyClass$1.WriteLnMyName(TMyClass$1);
TMyOtherClass.WriteLnMyName$1(TMyOtherClass);
WriteLn(TMyClass$1.GetMyName$(TMyClass$1));
WriteLn(TMyClass$1.GetMyName$(TMyOtherClass));
my = TObject.Create($New(TMyClass$1));
TMyClass$1.WriteLnMyName(my.ClassType);
WriteLn(TMyClass$1.GetMyName$(my.ClassType));
my = TObject.Create($New(TMyOtherClass));
TMyClass$1.WriteLnMyName(my.ClassType);
WriteLn(TMyClass$1.GetMyName$(my.ClassType));
myo = TObject.Create($New(TMyOtherClass));
TMyOtherClass.WriteLnMyName$1(myo.ClassType);
WriteLn(TMyClass$1.GetMyName$(myo.ClassType));
myo = null;
try {
TMyOtherClass.WriteLnMyName$1(myo.ClassType);
} catch ($e) {
var E = $W($e);
WriteLn(E.FMessage) }
TClassB.ClassProc(b.ClassType);
TClassB.ClassProc(TClassB);
TClassB.DoIt(b);
TBase.Test(c.ClassType);
TBase.Test(TChild);
TBase.Test2$1(c.ClassType);
TBase.Test2$1(TChild);
TBase.Call$1(c.ClassType);
TBase.CallVirtual$(c.ClassType);
TBase.Call$1(TChild);
TBase.CallVirtual$(TChild);
WriteLn(ClassName$1(TObject));
WriteLn(ClassName$1(TObject.ClassType(TObject)));
WriteLn(ClassName$1(d));
WriteLn(ClassName$1(TObject.ClassType(d)));
var TBase = {
$ClassName:"TBase",$Parent:TObject
,$Init:function ($) {
TObject.$Init($);
}
,Test:function(Self) {
WriteLn(("test "+TObject.ClassName(Self)));
}
,Test2$1:function(Self) {
WriteLn(("test2 "+TObject.ClassName(Self)));
}
,CallVirtual:function(Self) {
TBase.Test(Self);
TBase.Test2$1(Self);
}
,Call$1:function(Self) {
TBase.Test(Self);
TBase.Test2$1(Self);
}
,Destroy:TObject.Destroy
,CallVirtual$:function($){return $.CallVirtual($)}
};
var TChild = {
$ClassName:"TChild",$Parent:TBase
,$Init:function ($) {
TBase.$Init($);
}
,CallVirtual:function(Self) {
WriteLn("overridden");
TBase.CallVirtual(Self);
}
,Destroy:TObject.Destroy
,CallVirtual$:function($){return $.CallVirtual($)}
};
var TClassB = {
$ClassName:"TClassB",$Parent:TObject
,$Init:function ($) {
TObject.$Init($);
}
,ClassProc:function(Self) {
WriteLn((TObject.ClassName(Self)+" ClassProc"));
}
,DoIt:function(Self) {
TClassB.ClassProc(Self.ClassType);
TClassB.ClassProc(Self.ClassType);
}
,Destroy:TObject.Destroy
};
var TMyClass$1 = {
$ClassName:"TMyClass",$Parent:TObject
,$Init:function ($) {
TObject.$Init($);
}
,WriteLnMyName:function(Self) {
WriteLn("TMyClass");
}
,GetMyName:function(Self) {
return "This is TMyClass";
}
,Destroy:TObject.Destroy
,GetMyName$:function($){return $.GetMyName($)}
};
var TMyOtherClass = {
$ClassName:"TMyOtherClass",$Parent:TMyClass$1
,$Init:function ($) {
TMyClass$1.$Init($);
}
,WriteLnMyName$1:function(Self) {
WriteLn("TMyOtherClass");
}
,GetMyName:function(Self) {
return "I'm TMyOtherClass";
}
,Destroy:TObject.Destroy
,GetMyName$:function($){return $.GetMyName($)}
};