Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

public, private, protected <> static, virtual?


Страницы:   1 2 3

Den303 ©   (2006-12-20 16:14:00) 

Доброго времени суток всем!
Что-то я сегодня не выспался и туплю :o)
Плиз, ответьте....

Методы с какими модификаторами (public, private, protected) могут быть виртуальными?
Методы с какими модификаторами (public, private, protected) могут быть статическими?


tesseract   (2006-12-22 16:23:00) [1]


> Скорее всего, это просто никогда явно не требовалось.Пример,
>  когда необходимы виртуальные конструкторы:


Я про это и  говорю. Я вообще по аппаратуре/сети/winCE вот теперь :-)

Как RTTI работает понимаю :-)


Loginov Dmitry   (2006-12-22 15:41:00) [2]

> Хотя хз мож просто не помню


Скорее всего, это просто никогда явно не требовалось.

Пример, когда необходимы виртуальные конструкторы:


type
 TComponentClass = class of TComponent;

var
 ABtnClass: TComponentClass;
begin
 ABtnClass := TButton;
 ABtnClass.Create(Form1);

...
end;

Так вот. Ести конструктор Create не сделать виртуальным, то в данном примере (наверное) никакой кнопки создано не будет, т.е. ее родной конструктор просто не будет отработан. Имхо, всякие RTTI подобную технологию как раз и используют.


tesseract   (2006-12-22 15:17:00) [3]


> Ну если только никогда не создавал формы и компоненты в
> RunTime. Неужели никогда?


Create вызывал конечно, но не интересовался виртуальный в данный момент вызван конструктор или нет :-).

Это как ездить на машине и управлять машиной, когда везут процесс не колышет :-) Поэтому и говорю, что напрямую не пользовал его виртуальность.

Хотя хз мож просто не помню :-)


Loginov Dmitry   (2006-12-22 15:09:00) [4]

> Ну если только никогда не создавал формы и компоненты в
> RunTime. Неужели никогда?


При чем здесь создание форм и компонентов в RunTime?


Amoeba   (2006-12-22 14:53:00) [5]


> Да посмотрел,  конструкторы могут быть виртуальными. Я ими
> напрямую не пользовался.
>

Ну если только никогда не создавал формы и компоненты в RunTime. Неужели никогда?


tesseract   (2006-12-22 14:30:00) [6]


> о для того, чтобы получить доступ к Self в классовом методе
> совсем не обязательно его делать виртуальным.


Да необязательно. Статические методы

Class Static Methods

Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self parameter at all. They also cannot access any instance members.(They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual.


> tesseract ©   (21.12.06 21:55) [32]Не сталкивался,Нагло
> врешь ;-) Вся VCL на виртуальных конструкторах построена.
>


Да посмотрел,  конструкторы могут быть виртуальными. Я ими напрямую не пользовался.


jack128   (2006-12-22 11:53:00) [7]

tesseract ©   (21.12.06 21:55) [32]
class....static не имет доступа к полям и self. т.е не привязан к классу никак. В хелпе  не рекомендуется.

я ничего про статик и не говорил.  Но для того, чтобы получить доступ к Self в классовом методе совсем не обязательно его делать виртуальным.

tesseract ©   (21.12.06 21:55) [32]
Не сталкивался,

Нагло врешь ;-) Вся VCL на виртуальных конструкторах построена.


Kolan   (2006-12-22 10:26:00) [8]

> Ну так для этого есть reintroduce

Ну он же вначале «ворнинг» получит... И задумается.


С   (2006-12-22 08:22:00) [9]

>tesseract ©   (21.12.06 21:55) [32]
>class....static не имет доступа к полям и self

Виртуальность или ее отсутствие никак не влияет на доступность или недоступность Self в   class procedure/function. Просто в них Self - сам класс, а не конкретный объект.
По крайней мере, до D7 включительно.
Я, например, часто пишу типа такого:

class function TMyDlg.Execute: boolean;
begin
 with Self.Create do
 try
   result:= ShowModal = mrok;
 finally
   Free;
 end;
end;


Loginov Dmitry   (2006-12-22 07:39:00) [10]

> Не сталкивался, inherited рулит


Если задачи, которые очень тяжко решаются без виртуальных конструкторов. Сталкиваться приходилось.


tesseract   (2006-12-21 22:06:00) [11]


> Anatoly Podgoretsky ©   (21.12.06 22:01) [33]


И чего мне ega32 вспомнился? :-)


Anatoly Podgoretsky   (2006-12-21 22:01:00) [12]

> tesseract  (21.12.2006 21:55:32)  [32]

Вот Вася Пупкин его и убъет и начнет новую ветвь наследования.
Что бы этого не было - оформлять как private


tesseract   (2006-12-21 21:55:00) [13]


> jack128 ©   (21.12.06 18:00) [24]

class....static не имет доступа к полям и self. т.е не привязан к классу никак. В хелпе  не рекомендуется. Взято из справки по Turbo delphi и рекомендациям по C++ где стого-настрого не рекомендованы глобальные классы.  


> Ну так для этого есть reintroduce



Да он только warning убирает.


> Kolan ©   (21.12.06 21:01) [30]


Strict private , уже было. Пупкиных гнать поганой метлой :-)


> Loginov Dmitry ©   (21.12.06 17:50) [23]


Не сталкивался, inherited рулит :-)


Anatoly Podgoretsky   (2006-12-21 21:04:00) [14]

> Kolan  (21.12.2006 21:01:30)  [30]

Ну так для этого есть reintroduce
Но на Пупкина не повлияешь, он всегда имеет такую возможность на тех же принципах.


Kolan   (2006-12-21 21:01:00) [15]

> ors_archangel

А как быть если по логике метод перекрывать нельзя? И я хочу чтобы вася пупкин не смог этого сделать...


Плохиш   (2006-12-21 20:55:00) [16]


> ors_archangel ©   (21.12.06 20:48) [28]


> но за D7 отвечаю, что разницы нет

Проотвечался.


ors_archangel   (2006-12-21 20:48:00) [17]


> Чапаев ©   (21.12.06 20:37) [27]
> Ну да, то, что Вася Пупкин может написать потомка, учитывать
> не станем.

Какие отличия между "Вася Пупкин написал потомка" и "Я сам написал потомка" в данном контексте, не вижу. Может под .NET, конечно, что-нибудь и изменилось, но за D7 отвечаю, что разницы нет


Чапаев   (2006-12-21 20:37:00) [18]

> [26] ors_archangel ©   (21.12.06 20:30)
> когда для метода указан override-метод в каком-нить потомке
Ну да, то, что Вася Пупкин может написать потомка, учитывать не станем.


> зачем говорить, что "лашадь - это лошадь, потому что мне
> надо, что бы это была лошадь", лучше конкретно показать,
> что метод M есть overrrrrrride
Как я не догадася... Лошадь -- это оверрайд. Кен Кизи фарэва.


ors_archangel   (2006-12-21 20:30:00) [19]

Здесь в какой-то статье про это по-мойму даже говорилось: компилятор мог бы делать метод виртуальным, только когда это требуется(т.е. когда для метода указан override-метод в каком-нить потомке): зачем говорить, что "лашадь - это лошадь, потому что мне надо, что бы это была лошадь", лучше конкретно показать, что метод M есть overrrrrrride, если это не так, то в родительском virtualе нет смысла (он может быть с таким же успехом и статическим (при этом скорость как раз возрастёт (это насчёт разницы в скорости))), эта избыточность нужна Борланду, потому что умный компилятор сложнее сделать (конечно, компилировать он будет, возможно, медленнее, но  MSVC-шный по тормознутости, я думаю, ему всё равно, слава Борланду, никогда не догнать :)


Rule   (2006-12-21 18:39:00) [20]

да я не о том, :-) я как раз о виртуальном конструкторе как игрушке :-)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо