![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по ООП
Opilki_Inside © (2007-01-08 13:48:00)Есть класс
TClass1
в нем есть виртуальная процедура
procedure p1;virtual;
Класс TClass2 унаследован от TClass1 и внем переопредела процедура p1
procedure p1;override;
Как можно в классе TClass1 вызвать непереопределеннуюпроцедуру TClass1.p1? И можно ли вообще?
ors_archangel (2007-01-08 22:09:00) [1]Если я правильно понял, то 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;
- хотя когда же возникает необходимость для общего класса запрещать уточнение своего поведения, когда экземляр является более частным классом? Очень интересно
Kolan (2007-01-08 19:39:00) [2]
TClass2 = class(TCLass1)
procedure p1; override;
procedure p2;
end;
procedure TClass2.p2;
begin
inherited p1;
end;
Я проверил.
Kolan (2007-01-08 19:37:00) [3]Или вообще его закрыть. Те не делать в предке виртуальным и не делать override.
Opilki_Inside (2007-01-08 19:37:00) [4]
> «(Self as TClass1).p1;»
>
> Это еще что?
Да это просто... забей :-)
Ладно, я так понял нельзя сделать как я хочу... А функция p2 совсем не обязательно должна быть виртуальной...
Kolan (2007-01-08 19:36:00) [5]procedure TClass2.p2;
begin
inherited p1;
end;
Kolan (2007-01-08 19:35:00) [6]«(Self as TClass1).p1;»
Это еще что?
«Как сделать так что бы в методе p2 вызывался метод p1 класс
TClass1 не переопределенный в TClass2
Т.е. что бы на экране было сообщение 1»
Сделать p2 виртуальной и перекрыть её в TClass2
TClass2 = class(TCLass1)
procedure p1; override;
procedure p2; override;
end;
Opilki_Inside (2007-01-08 19:29:00) [7]
> «Вот можно ли сделать так что бы в процедуре 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:12:00) [8]«Вот можно ли сделать так что бы в процедуре p2 вызывалась
процедура p1 из класса TClass1 ?»
inherited p1
Opilki_Inside (2007-01-08 18:16:00) [9]
> во - первых, это не процедура а МЕТОД
> во - вторых, ОБЪЕКТ класса вызывает метод
И?
i-am-vladko (2007-01-08 18:06:00) [10]
> > > Как можно в классе TClass1 вызвать непереопределенную
>
> > процедуру
> > > TClass1.p1? И можно ли вообще?
во - первых, это не процедура а МЕТОД
во - вторых, ОБЪЕКТ класса вызывает метод
читай книжки, умник
Opilki_Inside (2007-01-08 15:37:00) [11]
> я ответил четко на твой вопрос )))
> > Как можно в классе TClass1 вызвать непереопределенную
> процедуру
> > TClass1.p1? И можно ли вообще?
Ну не совсем...:-) Где в классе TClass1 вызов процедры P1 ?
i-am-vladko (2007-01-08 15:30:00) [12]я ответил четко на твой вопрос )))
> Есть класс
> TClass1
> в нем есть виртуальная процедура
> procedure p1;virtual;
>
> Класс TClass2 унаследован от TClass1 и внем переопредела
> процедура p1
> procedure p1;override;
>
> Как можно в классе TClass1 вызвать непереопределенную процедуру
> TClass1.p1? И можно ли вообще?
Opilki_Inside (2007-01-08 15:25:00) [13]чуток опечатался
procedure TForm1.Button3Click(Sender: TObject);
var a : Tclass2;
begin
a := TClass2.Create;
a.p2;
end;
Opilki_Inside (2007-01-08 15:24:00) [14]
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 ?
Kolan (2007-01-08 14:46:00) [15]> Мне нужно имеено из TClass1 вызвать TClass1.p1
Видимо ты не понимаешь что ты работаешь в итоге не с клссами, а с их экземплярами.
А то что ты спросил будет так:
TClass1 = class
procedure DoSmth;
end;
procedure TClass1.DoSmth
begin
p1;
end;
i-am-vladko (2007-01-08 14:35:00) [16]Второй вариант кода - измени только это
procedure TClass2.p1;
begin
//showmessage('2');
inherited;
end;
посмотри
i-am-vladko (2007-01-08 14:33:00) [17]проверь если на слово не веришь ))
i-am-vladko (2007-01-08 14:32:00) [18]
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;
Opilki_Inside (2007-01-08 14:25:00) [19]
> если он TClass1 - то только ее он и вызовет
Он вызовет переопределенную процедуру
Opilki_Inside (2007-01-08 14:25:00) [20]Экземпляр от TClass2
Мне нужно имеено из TClass1 вызвать TClass1.p1