Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Вопрос по ООП   Найти похожие ветки 

 
Opilki_Inside ©   (2007-01-08 13:48) [0]

Есть класс
TClass1
в нем есть виртуальная процедура
 procedure p1;virtual;

Класс TClass2 унаследован от TClass1 и внем переопредела процедура p1
procedure p1;override;

Как можно в классе TClass1 вызвать непереопределенную процедуру TClass1.p1? И можно ли вообще?


 
Юрий Зотов ©   (2007-01-08 13:51) [1]

> Как можно в классе TClass1

TClass2, видимо. Тогда так: inherited p1


 
i-am-vladko ©   (2007-01-08 13:52) [2]

все зависит от объекта
если он TClass1 - то только ее он и вызовет
если TClass2 -  inherited p1


 
Opilki_Inside ©   (2007-01-08 14:25) [3]

Экземпляр от TClass2
Мне нужно имеено из TClass1 вызвать TClass1.p1


 
Opilki_Inside ©   (2007-01-08 14:25) [4]


> если он TClass1 - то только ее он и вызовет

Он вызовет переопределенную процедуру


 
i-am-vladko ©   (2007-01-08 14:32) [5]

 TClass1 = class
 protected
  procedure p1; virtual;
 end;

 TClass2 = class(TCLass1)
 procedure p1; override;
 end;

{ TClass1 }

procedure TClass1.p1;
begin
showmessage("1");
end;

{ TClass2 }

procedure TClass2.p1;
begin
showmessage("2");
end;

procedure TForm1.Button1Click(Sender: TObject);
var a : TClass1;
begin
a := TClass1.Create;
a.p1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p1;
end;


 
i-am-vladko ©   (2007-01-08 14:33) [6]

проверь если на слово не веришь ))


 
i-am-vladko ©   (2007-01-08 14:35) [7]

Второй вариант кода - измени только это
procedure TClass2.p1;
begin
//showmessage("2");
inherited;
end;

посмотри


 
Kolan ©   (2007-01-08 14:46) [8]

> Мне нужно имеено из TClass1 вызвать TClass1.p1

Видимо ты не понимаешь что ты работаешь в итоге не с клссами, а с их экземплярами.

А то что ты спросил будет так:
TClass1 = class
 procedure DoSmth;
end;

procedure TClass1.DoSmth
begin
 p1;
end;


 
Opilki_Inside ©   (2007-01-08 15:24) [9]

TClass1 = class
protected
 procedure p1; virtual;
public
 procedure p2;
end;

TClass2 = class(TCLass1)
procedure p1; override;
end;

{ TClass1 }

procedure TClass1.p1;
begin
showmessage("1");
end;

procedure TClass1.p2;
begin
 p1;
end;

{ TClass2 }

procedure TClass2.p1;
begin
 inherited;
showmessage("2");
end;

procedure TForm1.Button1Click(Sender: TObject);
var a : TClass1;
begin
a := TClass1.Create;
a.p1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p1;
end;

procedure TForm1.Button3Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p1;
end;


Вот можно ли сделать так что бы в процедуре p2 вызывалась процедура p1 из класса TClass1 ?


 
Opilki_Inside ©   (2007-01-08 15:25) [10]

чуток опечатался

procedure TForm1.Button3Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p2;
end;


 
i-am-vladko ©   (2007-01-08 15:30) [11]

я ответил четко на твой вопрос )))

> Есть класс
> TClass1
> в нем есть виртуальная процедура
>  procedure p1;virtual;
>
> Класс TClass2 унаследован от TClass1 и внем переопредела
> процедура p1
> procedure p1;override;
>
> Как можно в классе TClass1 вызвать непереопределенную процедуру
> TClass1.p1? И можно ли вообще?


 
Opilki_Inside ©   (2007-01-08 15:37) [12]


> я ответил четко на твой вопрос )))



> > Как можно в классе TClass1 вызвать непереопределенную
> процедуру
> > TClass1.p1? И можно ли вообще?


Ну не совсем...:-) Где в классе TClass1 вызов процедры P1 ?


 
i-am-vladko ©   (2007-01-08 18:06) [13]


> > > Как можно в классе TClass1 вызвать непереопределенную
>
> > процедуру
> > > TClass1.p1? И можно ли вообще?

во - первых, это не процедура а МЕТОД
во - вторых, ОБЪЕКТ класса вызывает метод

читай книжки, умник


 
Opilki_Inside ©   (2007-01-08 18:16) [14]


> во - первых, это не процедура а МЕТОД
> во - вторых, ОБЪЕКТ класса вызывает метод


И?


 
Kolan ©   (2007-01-08 19:12) [15]

«Вот можно ли сделать так что бы в процедуре p2 вызывалась
процедура p1 из класса TClass1 ?»

inherited p1


 
Opilki_Inside ©   (2007-01-08 19:29) [16]


> «Вот можно ли сделать так что бы в процедуре p2 вызывалась
> процедура p1 из класса TClass1 ?»
>
> inherited p1


да нее...

вот код:

TClass1 = class
protected
 procedure p1; virtual;
public
 procedure p2;
end;

TClass2 = class(TCLass1)
procedure p1; override;
end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TClass1.p1;
begin
 showmessage("1");
end;

procedure TClass1.p2;
begin
 (Self as TClass1).p1;
end;

procedure TClass2.p1;
begin
 showmessage("2");
end;

procedure TForm1.Button3Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p2;
end;


Как сделать так что бы в методе p2 вызывался метод p1 класс TClass1 не переопределенный в TClass2
Т.е. что бы на экране было сообщение "1"


 
Kolan ©   (2007-01-08 19:35) [17]

«(Self as TClass1).p1;»

Это еще что?


«Как сделать так что бы в методе p2 вызывался метод p1 класс
TClass1 не переопределенный в TClass2
Т.е. что бы на экране было сообщение „1“»


Сделать p2 виртуальной и перекрыть её в TClass2
TClass2 = class(TCLass1)
procedure p1; override;
procedure p2; override;
end;


 
Kolan ©   (2007-01-08 19:36) [18]

procedure TClass2.p2;
begin
inherited p1;
end;


 
Opilki_Inside ©   (2007-01-08 19:37) [19]


> «(Self as TClass1).p1;»
>
> Это еще что?

Да это просто... забей :-)

Ладно, я так понял нельзя сделать как я хочу... А функция p2 совсем не обязательно должна быть виртуальной...


 
Kolan ©   (2007-01-08 19:37) [20]

Или вообще его закрыть. Те не делать в предке виртуальным и не делать override.


 
Kolan ©   (2007-01-08 19:39) [21]

TClass2 = class(TCLass1)
procedure p1; override;
procedure p2;
end;

procedure TClass2.p2;
begin
 inherited p1;
end;


Я проверил.


 
ors_archangel ©   (2007-01-08 22:09) [22]

Если я правильно понял, то Opilki_Inside хочет вызвать статически вызвать виртуальный метод, т.е. в обход VMT, т.е. в обход наследования, если да, то

type
 TClass1 = class
 protected
   procedure p1; virtual;
   procedure originalp1; virtual;
 public
   procedure p2;
 end;

 TClass2 = class(TCLass1)
   procedure p1; override;
   procedure originalp1; override;
 end;

procedure TClass1.p1;
begin
showmessage("1");
end;
procedure TClass2.p1;
begin
showmessage("2");
end;

procedure TClass1.p2;
begin
 originalp1;
end;

procedure Tclass1.originalp1;
begin
 p1;
end;
procedure TClass2.originalp1;
begin
 inherited p1;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
 a: Tclass2;
begin
 a := TClass2.Create;
 a.p2;
 a.free;
end;

Вся проблема в том, что конструкция inherited, которая "plays a special role in implementing polymorphic behavior", как всегда у Борланда - сделана минимально гибко, с минимальной функциональностью, нельзя написать:

 with TClass2(Self) do inhertied p1;

- хотя когда же возникает необходимость для общего класса запрещать уточнение своего поведения, когда экземляр является более частным классом? Очень интересно



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

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.054 c
2-1168365957
Bolt
2007-01-09 21:05
2007.01.28
MDI Приложение


3-1162659008
pirate
2006-11-04 19:50
2007.01.28
проблемы разработки программ для образования


15-1168268446
Windows
2007-01-08 18:00
2007.01.28
Помогите с задачкой


15-1168402510
Slider007
2007-01-10 07:15
2007.01.28
С днем рождения ! 10 января


2-1168169514
mike-d
2007-01-07 14:31
2007.01.28
Проверка имени создаваемого файла