IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Перекрывание методов...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Всё ещё пытаюсь разобраться с Delphi,поэтому такой вам вопрос...Что означает перекрывание методов с помощью override,зачем это нужно,если мы можем просто в потомке создать одноимённый метод с другими пар-ми,и просто его запустить...?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
если мы можем просто в потомке создать одноимённый метод с другими пар-ми, и просто его запустить...?
А если НЕ в потомке, а в том же классе мне понадобится создать 2 метода с одинаковым именем, но разными параметрами, тогда как без Override?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


А можно на это пример привести?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






А попробуй откомпилировать:
...
b = object
float_add: double;
procedure print(i: integer);
procedure print(f: double); // <--- Ошибочка, Override надо !!!

end;

procedure b.X(f: double);
begin
showmessage(floattostr(f + float_add));
end;
procedure b.X(i: integer);
begin
showmessage(inttostr(i));
end;
...
Только не спрашивай, зачем ЭТО нужно... Вот нужно мне это и все... Я не хочу запоминать десять имен типа print_integer/print_double/print_string/print_char ..., а хочу использовать перегрузку и работать с print, а что именно должно быть вызвано - это пусть компилятор разбирается...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


А если я сделаю вот так:
Код

type
TD1 = class(Tobject)
x1:integer;
procedure Do(x1:integer);
end;
TD2 = class(T1)
x2:integer;
procedure Do(x2:integer);
var
...........
procedure TD1.Do(x1:integer)
begin
x1:=X1*X1;
end;
procedure TD2.Do(x2:integer)
begin
x2:=X2/X2;
end;
............
D1.Do;
D2.Do;

метод потомка автоматически перекроет метод предка без всякого override?

Сообщение отредактировано: Vardes -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






А с НЕвиртуальными методами вообще не используется Override... Я там выше ошибся кстати, надо не Override, а Overload добавлять...

А по поводу разницы между методом С override и БЕЗ него - написано в хелпе:
Цитата(D6 Help)
Overriding versus hiding
If a method declaration specifies the same method identifier and parameter signature as an inherited method, but doesn’t include override, the new declaration merely hides the inherited one without overriding it. Both methods exist in the descendant class, where the method name is statically bound.
Вот тебе и разница...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Попробуй запустить две программки:

1.
TA=class
a,b,c:integer;
procedure first;
procedure second;virtual;
end;

TB=class(TA)
procedure second;override;
end;
....
procedure TA.second;
begin
c:=a+b;
end;

procedure TA.first;
begin
a:=5;
b:=8;
second;
end;

procedure TB.second;
begin
c:=a-b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var O2: TB;
begin
O2:=TB.Create;
O2.first;
ShowMessage(IntToStr(O2.c));
end;



2.
TA=class
a,b,c:integer;
procedure first;
procedure second;
end;

TB=class(TA)
procedure second;
end;
....
procedure TA.second;
begin
c:=a+b;
end;

procedure TA.first;
begin
a:=5;
b:=8;
second;
end;

procedure TB.second;
begin
c:=a-b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var O2: TB;
begin
O2:=TB.Create;
O2.first;
ShowMessage(IntToStr(O2.c));
end;


Я думаю, разницу увидишь.

Цитата
А с НЕвиртуальными методами вообще не используется Override...

Динамический рассматривается как разновидность виртуального? А то я всегда мучаюсь - как бы их одним словом обозвать.

Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
Динамический рассматривается как разновидность виртуального?
Это фактически одно и то же:
Цитата(D6 Help)
Virtual versus dynamic
Virtual and dynamic methods are semantically equivalent. They differ only in the implementation of method-call dispatching at runtime. Virtual methods optimize for speed, while dynamic methods optimize for code size.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


но ведь:
Цитата
Virtual methods optimize for speed, while dynamic methods optimize for code size.

достигается за счет разной реализации? то есть это по сути разные вещи...
а обобщающего слова не придумали sad.gif


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Юля, кстати... Вопрос на засыпку: что будет выведено в результате выполнения следующего кода:
uses sysutils;

type
TA = class
a,b,c:integer;
procedure first;
procedure second; virtual;
end;

TB = class(TA)
procedure second; virtual;
end;

procedure TA.second;
begin
c := a+b;
end;

procedure TA.first;
begin
a := 5;
b := 8;
second;
end;

procedure TB.second;
begin
c:=a-b;
end;

var O2: TB;
begin
O2:=TB.Create;
O2.first;
writeln(IntToStr(O2.c));
end.
(НЕ override !!! Виртуальные функции... ) Если можно - без использования компилятора, что ТЕОРЕТИЧЕСКИ должно быть выведено? smile.gif ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
Вопрос на засыпку: что будет выведено в результате выполнения следующего кода:

Спойлер (Показать/Скрыть)



--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


в таком виде - ошибка ;)
а по сути - раз override нет, то, думаю, 13... то есть вызовется first от TA


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






smile.gif
Еще варианты будут?

Кстати, дополнение к вопросу: как изменится картина (если изменится), если я опишу first вот так:
type
TA = class
a,b,c:integer;
procedure first; virtual; // <-- !!!
procedure second; virtual;
end;
cool.gif

Цитата
в таком виде - ошибка ;)
С чего бы? Нет тут никакой ошибки smile.gif Все работает... Вопрос в силе...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


а... сорри. про консольные приложения забыла.

мне кажется, не изменится никак.




--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Хорошо, допустим... А теперь - контрольный выстрел: smile.gif

Что будет сейчас?

uses sysutils;

type
TA = object
a,b,c:integer;
constructor create;
procedure first;
procedure second; virtual;
end;

TB = object(ta)
constructor create;
procedure second; virtual;
end;

constructor ta.create;
begin end;
procedure TA.second;
begin
c := a+b;
end;


procedure TA.first;
begin
a := 5;
b := 8;
second;
end;

constructor tb.create;
begin inherited create; end;
procedure TB.second;
begin
c:=a-b;
end;

var O2: TB;
begin
o2.create;
O2.first;
writeln(IntToStr(O2.c));
end.

blum.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


по-моему, даже такое изменение в коде:
constructor tb.create;
begin end;

ни на что не повлияет.
а выдаст она -3.
пояснения написать?

Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Да... Вот теперь меня и интересуют пояснения, ПОЧЕМУ один и тот же код по-твоему при использовании классов выдаст одно, а при использовании объектов - другое... Объяснение этому факту приведи, пожалуйста... (я надеюсь это не "проверено на компиляторе"? Меня интересует логика...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Ух ты!!!!
Какое здесь обсуждение завели,спасибо вам...теперь хоть стал немного разбираться...Но возникли ещё вопросы по поводу визуальных компонент....
Есть такой класс в Delphi,как TStaticText,я его использую,для просмотра значения переменной в цикле (цикл большой,от 1000),ну так вот,где-то первые значения мне строка показывает,а потом переменные перестают выводиться на экран в течение цикла, как только он заканчивается выводится последний результат.Из-за чего такое может быть?И ещё....никак не могу понять как работать с классом TspinEdit...могли бы вы привести пример для задания значения переменной?Заранее спасибо smile.gif

Сообщение отредактировано: Vardes -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


по-моему, после такой дискуссии начать разбираться нереально. smile.gif
volvo, в общем это.... знаний немного, так что на 90% собственное домысливание (с применением женской логики). соответственно, могу ошибаться...
отталкивалась от того, что object есть и в паскале, а class - только в делфи. (коряво по терминологии, понимаю, что глупо сравнивать язык и среду... но, думаю, идею уловил).
object оставили, как мне кажется, для совместимости...
а раз для совместимости - значит, работать они должны по тому же принципу, что и в паскале (а иначе какой смысл?). что такое override паскаль не знает, а что такое virtual - прекрасно понимает. поскольку у нас есть конструктор (хоть и пустой, на первый взгляд ничего не делающий) - таблица вирт.методов создается как положено. итак, раз virtual, надо использовать метод потомка.
теперь пример с классами. делфи про override прекрасно знает. а раз его нет - значит, и перекрывания не происходит (а чего перекрывать, если не просят?)...

Vardes, по второму вопросу:
a:integer;
...
a:=SpinEdit1.Value;


Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 131
Пол: Мужской

Репутация: -  0  +


Хотелось бы ещё узнать про TStaticTest...как можно увеличить в этом классе дину строки,а то показывает мне только 14 знаков после запятой (у меня так переменная меняется),а надо больше)

Сообщение отредактировано: Vardes -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.09.2020 22:57
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name