Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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-класса
> в С++


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


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

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



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.012 c
1-69764
kopachev
2002-04-08 16:43
2002.04.22
Подкиньте идею


1-69820
$hiC0
2002-04-10 15:08
2002.04.22
Form1.Print


14-70033
Ajax
2002-03-13 19:09
2002.04.22
Текст в .doc


1-69773
VJar
2002-04-10 00:42
2002.04.22
Небольшой почтовый проект


1-69854
dimonf
2002-04-08 21:40
2002.04.22
Народ, подскажите, как распечатать график сформированный Chart?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский