Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизВопрос по ООП Найти похожие ветки
← →
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 виртуальной и перекрыть её в TClass2TClass2 = 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.121 c