Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 16 июн 2025, 09:49

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 15 авг 2018, 16:49 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
В книге "Основы объектно-ориентированного программирования в языке паскаль" (Ростов-на-Дону, 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"
  1. MODULE Music;
  2.  
  3. IMPORT StdLog;
  4.  
  5. TYPE album = EXTENSIBLE RECORD
  6. autor: ARRAY 30 OF CHAR;
  7. albumName: ARRAY 255 OF CHAR;
  8. publicationDate: SHORTINT
  9. END;
  10.  
  11. TYPE songOrMelody = RECORD (album)
  12. name: ARRAY 255 OF CHAR
  13. END;
  14.  
  15. VAR
  16. albumInstance: album;
  17. songOrMelodyInstance: songOrMelody;
  18.  
  19. PROCEDURE (VAR albumMethod: album) Init, NEW, EXTENSIBLE;
  20. BEGIN
  21. songOrMelodyInstance.autor := "Elton John"
  22. END Init;
  23.  
  24. PROCEDURE (VAR songOrMelodyMethod: songOrMelody) Init;
  25. BEGIN
  26. songOrMelodyInstance.autor := "Мой альбом"
  27. END Init;
  28.  
  29. PROCEDURE (VAR albumMethod: album) Output, NEW;
  30. BEGIN
  31. Init;
  32. StdLog.String (songOrMelodyInstance.autor)
  33. END Output;
  34.  
  35. BEGIN
  36. StdLog.Clear;
  37. albumInstance.Output;
  38. songOrMelodyInstance.Output
  39. END Music.

Как сделать чтобы в методе Output метод Init вызывался в объекте предке или потомке в зависимости от типа объекта, без оператора IS?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 15 авг 2018, 21:18 
Не в сети

Сообщения: 146
Я так понимаю, Вы не запускали эту программу, потому что не смогли собрать?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 16 авг 2018, 02:43 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Comdiv писал(а):
Я так понимаю, Вы не запускали эту программу, потому что не смогли собрать?

В моей программе компилятор выдаёт ошибку в 31 строке.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 16 авг 2018, 06:32 
Не в сети
Администратор
Аватара пользователя

Сообщения: 108
Код: "OBERON"


Вот так надо вызывать.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club