Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Вниз

object pascal 


kreont   (2002-04-06 23:01) [0]


type A = class
procedure f; virtual;
end;

procedure A.f;
begin
writeln(" A.f ");
end;

type B = class (A)
procedure f; override;
end;

procedure B.f;
begin
writeln(" B.f ");
end;

var MyObject : B;
begin
MyObject = B.create();
// Как мне здесь вызвать функцию f из класса-предка a используя MyObject ??
B.free;
end.



kreont   (2002-04-06 23:04) [1]

Ошибочка ... напишу теперь всё как полагается..

interface
type A = class
procedure f; virtual;
end;

type B = class (A)
procedure f; override;
end;

implementation

procedure A.f;
begin
writeln(" A.f ");
end;

procedure B.f;
begin
writeln(" B.f ");
end;

var MyObject : A;
begin
MyObject = B.create();
// Как мне здесь вызвать функцию f из класса-предка A используя MyObject ??
B.free;
end.


Вот так!



kreont   (2002-04-06 23:07) [2]

опять бяка... не B.free; a MyObject.free;
совсем заглючило :(



MBo   (2002-04-06 23:29) [3]

извращаемся?

procedure TForm1.Button3Click(Sender: TObject);
type TProc=Procedure of object;
var m:TMethod;
begin
MyObject := B.create;
M.Code:=@A.f;
M.Data:=MyObject;
Tproc(M);
myobject.free;
end;



kreont   (2002-04-06 23:41) [4]

Хм... короче это такая головоломка на знание object pascal
Можно только одно keyword добавить но сколько хошь раз.
вот упрощённый текст задания.

interface
type A = class
procedure f; virtual;
end;

type B = class (A)
procedure f; override;
end;

type C = class (B)
procedure f; override;
end;

implementation

procedure A.f;
begin
writeln(" Nice! ");
end;

procedure B.f;
begin
writeln(" RTFM ");
end;

procedure C.f;
begin
inherited;
end;

var MyObject : A;
begin
MyObject = C.create();
MyObject.f;
MyObject.free;
end.

Сейчас программа напишет "RTFM"
а надо "Nice!" ... один keyword можно добавить...
башка щас взорвётся..



MBo   (2002-04-06 23:44) [5]

в b.f
inherited; ;)



MBo   (2002-04-06 23:54) [6]

задачу на ходу меняешь.

Еще так занятно

procedure B.f;
begin
if self is C then inherited
else showmessage("B.f");
end;



kreont   (2002-04-07 00:19) [7]

последний вариант не подходит (СМ условие ) а первый тоже потому что низзя 2 мессаджа выводить :))



MBo   (2002-04-07 00:45) [8]

заменить writeln(" RTFM ");
на
inherited;
Delphi какие?



kreont   (2002-04-07 02:01) [9]

:) ладно... всё таки тест самостоятельно выполнять надо.



Fantasist   (2002-04-07 07:03) [10]

Условий не достаточно. Непонятно, что можно менять. Сейчас, как кийвордами не играй, все равно MyObject просто не имеет информации о методе A.f. У него всего лишь виртуальная таблица с одним методом, адрес которого был задан во время C.Create; Это можно следать, если A.f сделать не вертуальной.



danik   (2002-04-08 21:47) [11]

Each of following programs has one missed keyword at one or some places. If we add this keyword we"ll see corresponding text "TA" in a message box on program execution. One and only one message box will be shown. Please write down the keyword and line number(s) where it should be for each program.

A01 program Project10;
A02
A03 uses
A04 Unit10 in "Unit10.pas",
A05 Unit11 in "Unit11.pas";
A06
A07 type
A08 TC = class (TB)
A09 public
A10 procedure f1; override;
A11 end;
A12
A13 procedure TC.f1;
A14 begin
A15 inherited;
A16 end;
A17
A18 var q : TA;
A19 begin
A20 q := TC.Create;
A21 try
A22 q.f1;
A23 finally
A24 q.Free;
A25 end;
A26 end.



--------------------------------------------------------------------------------

B01 unit Unit10;
B02 interface
B03 type
B04 TA = class
B05 public
B06 procedure f1; virtual;
B07 end;
B08
B09 implementation
B10 uses Dialogs;
B11
B12 procedure TA.f1;
B13 begin
B14 ShowMessage("TA");
B15 end;
B16
B17 end.


--------------------------------------------------------------------------------

C01 unit Unit11;
C02 interface
C03 uses Unit10;
C04 type
C05 TB = class (TA)
C06 public
C07 procedure f1; override;
C08 end;
C09
C10 implementation
C11 uses Dialogs;
C12
C13 procedure TB.f1;
C14 begin
C15 ShowMessage("TB");
C16 end;
C17
C18 end.



Fantasist   (2002-04-09 00:37) [12]

Хе! Так сразу и надо было говорить. Юниты то разные. В классическом ООП это бы сработало, если бы все эти классы были в одном юните, но не в Delphi.
Итак: С07 - private

TB = class (TA)
public
private procedure f1; override;
end;

В одном юните Делфи, почему-то, разрешает видить приваьные члены других классов.



danik   (2002-04-09 00:44) [13]

я уж весь delphi5.hlp перечитал про Object Pascal reference....
.....вот где бяка то оказывается....

Большое спасибо.



ION T   (2002-04-09 00:45) [14]


> В одном юните Делфи, почему-то, разрешает видить приваьные
> члены других классов.


Это не почему-то, а чтобы хоть как-то сделать аналог friendly-класса в С++



danik   (2002-04-09 00:53) [15]

а где про особенности юнитов в Делфи можно поподробнее прочитать?



Fantasist   (2002-04-09 02:06) [16]


> ION T © (09.04.02 00:45)
>
> > В одном юните Делфи, почему-то, разрешает видить приваьные
>
> > члены других классов.
>
>
> Это не почему-то, а чтобы хоть как-то сделать аналог friendly-класса
> в С++


Если цель была эта, то реализованно отвратительно. Получили ни то ни се.


> а где про особенности юнитов в Делфи можно поподробнее прочитать?

Незнаю. :)
Самому поизучать... :)




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.024 c
1-69837           kopachev              2002-04-09 21:11  2002.04.22  
Ищу StringGrid


4-70069           ATLANTIDO             2002-02-14 18:01  2002.04.22  
Верхнее окно


1-69864           AZU                   2002-04-08 12:38  2002.04.22  
TComboBox.Ctl3d


3-69688           Андре_                2002-03-26 12:25  2002.04.22  
Crystal Reports


3-69731           Kirill                2002-03-28 17:15  2002.04.22  
Помогите сформировать запрос