Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 виртуальной и перекрыть её в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.046 c
2-1168251367
Patrick
2007-01-08 13:16
2007.01.28
Проблема округления


15-1167339007
Ringo
2006-12-28 23:50
2007.01.28
О тщетности всякого усилия.


2-1168510227
root
2007-01-11 13:10
2007.01.28
Как правельно обрабатывать исключения


4-1158572068
_Sergey_
2006-09-18 13:34
2007.01.28
Проблема с HT


3-1162996659
Megabyte
2006-11-08 17:37
2007.01.28
Помогите составить запрос или подскажите что другое





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский