В книге "Основы объектно-ориентированного программирования в языке паскаль" (Ростов-на-Дону, 1999) есть следующий код:
Uses Crt, Graph;
Var gd,gm : integer;
Type Tp=Object
X,y,c : integer;
Constructor Init(ax,ay,ac : integer);
Procedure Show; Virtual;
Procedure Hide; Virtual;
Procedure Moveto(dx,dy : integer);
End;
Constructor Tp.Init;
Begin
X:=ax; y:=ay; c:=ac
End;
Procedure Tp.Show;
Begin
Putpixel(x,y,c);
End;
Procedure Tp.Hide;
Begin
Putpixel(x,y,Getbkcolor)
End;
Procedure Tp.Moveto;
Begin
Delay(1000); Hide;
X:=x+dx; y:=y+dy;
Show
End;Type Tc=Object(Tp)
R : integer;
Constructor Init(ax,ay,ac,ar : integer);
Procedure Show; Virtual;
Procedure Hide; Virtual;
End;
Constructor Tc.Init;
Begin
Inherited(ax,ay,ac);
R:=ar
End;
Procedure Tc.Show;
Begin
Setcolor(c);
Circle(x,y,r)
End;
Procedure Tc.Hide;
Begin
Setcolor(Getbkcolor);
Circle(x,y,r)
End;
Var P : Tp;
C : Tc;
Begin
Gd:=Detect;
Initgraph(Gd,Dm,’c:\bp\bgi’);
P.Init(100,120,yellow);
P.Show; P.Moveto(50,50);
Readln;
C.Init(200,300,Green,150);
C.Show; C.Moveto(10,10);
Readln;
Closegraph
End.
В методе Tp.Moveto методы Hide и Show в зависимости от типа объекта вызываются соответственно в объекте предке или потомке. Я сочинил небольшую програмку ради эксперимента:
Код: "OBERON"
MODULE Music;
IMPORT StdLog;
TYPE album = EXTENSIBLE RECORD
autor: ARRAY 30 OF CHAR;
albumName: ARRAY 255 OF CHAR;
publicationDate: SHORTINT
END;
TYPE songOrMelody = RECORD (album)
name: ARRAY 255 OF CHAR
END;
VAR
albumInstance: album;
songOrMelodyInstance: songOrMelody;
PROCEDURE (VAR albumMethod: album) Init, NEW, EXTENSIBLE;
BEGIN
songOrMelodyInstance.autor := "Elton John"
END Init;
PROCEDURE (VAR songOrMelodyMethod: songOrMelody) Init;
BEGIN
songOrMelodyInstance.autor := "Мой альбом"
END Init;
PROCEDURE (VAR albumMethod: album) Output, NEW;
BEGIN
Init;
StdLog.String (songOrMelodyInstance.autor)
END Output;
BEGIN
StdLog.Clear;
albumInstance.Output;
songOrMelodyInstance.Output
END Music.
Как сделать чтобы в методе Output метод Init вызывался в объекте предке или потомке в зависимости от типа объекта, без оператора IS?