Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Вниз

Терминольтгические странности в книге   Найти похожие ветки 

 
KSergey   (2003-05-10 08:28) [0]

Читал тут книжецу по D5 и удивили некоторые термины. Хотелось бы мнение спросить знатоков.
1)Конструкция вида (Obj As TClass) названа неявным приведением типов. В противоположность этому конструкция TClass(Obj) названа явным приведением. Но где же в первом случае неявное приведение? По-моему очень даже явное. Или в дельфи действительно применяется в данном случае такой термин? Тогда он идет полностью в разрез с аналогичным термином, применяемым в Си...
2)Класс TObject назван абстрактным. Какой же он абстактный, если все его методы определены?! Или я снова чего-то недопонимаю?


 
KSergey   (2003-05-10 08:37) [1]

Да уж.. Заголовок вышел на славу ;)


 
Sergey Masloff   (2003-05-10 09:08) [2]

1) Оператор as осуществляет безопасное приведение типа, или приведение типа с контролем.
Например:

var
bt : TButton;
gr : TDBGrid;
begin
gr := TDBGrid.Create(nil);
........
bt := gr as TButton; // Это не пройдет на этапе компиляции
~~~~~~~~~~~~~~~~~~~~
bt := TButton(gr); // Это компилятор пропустит

2) TObject является абстрактным классом в том смысле что его экземпляры никогда не создаются (хотя язык это позволяет).


 
Юрий Зотов   (2003-05-10 11:07) [3]

1. По поводу AS. Приведение через него происходит с проверкой и, если она не проходит, то в run-time получаем нормальное и осмысленное исключение, а дальнейшие действия НЕ выполняются. Прямое же приведение происходит без проверок и эти дальнейшие действия сразу же выполняются. Каков уж будет их результат - это полная ответственность программиста. Может быть, все пройдет нормально, может, получим исключение (но уже ПРИ выполнении этих действий, а не ДО них), а может, исключения и не произойдет, но программа будет работать неверно.

Поэтому прямое (наверное, слово "прямое" здесь было бы более удачным, чем "явное") приведение типов работает быстрее (нет действий по проверке) но использовать его надо аккуратно, когда есть полная уверенность в его правильности. В книге Тейксейры и Пачеко приводится пример такого рода:

if Sender is TButton then (Sender as TButton).Click;

Зачем здесь AS? Это совершенно лишнее замедление программы. Ведь мы только что УЖЕ проверили класс Sender"а и вторая проверка не нужна. Поэтому в данном случае лучше так:

if Sender is TButton then TButton(Sender).Click;


2. По поводу конструций (Obj as TClass) и TClass(Obj). Все же немного странно, что в книге использован именно такой пример. Дело в том, что обе эти конструкции дадут правильное приведение, если Obj является КЛАССОМ, а не ЭКЗЕМПЛЯРОМ класса - но мнемоника идентификатора Obj позволяет предполагать обратное, что вносит некоторую путаницу. Поэтому пример в книге, видимо, не вполне удачен и следовало бы использовать, например, такой: (A as TObject) и TObject(A).


3. Конечно, в смысле строгой терминологии используемой в Delphi объектной модели, TObject абстрактным классом НЕ является. Думаю, автору (или авторам) книги следовало бы быть более аккуратными в подборе слов, дабы не запутывать читателей.


 
KSergey   (2003-05-10 11:20) [4]

Применяемые "слова" - мои. Под Obj понимал именно экземпляр класса. В общем стал судить других, а написал так, что и меня не поняли ;)
Вообще-то основным вопросом было не что они делают (это я, во всяком случае надеюсь, знаю). Интересовала именно допустимость применяемых терминов.


 
DiamondShark   (2003-05-10 11:32) [5]


> KSergey © (10.05.03 11:20)

Тогда всё просто.

1) Оператор AS -- безопасное (защищённое) привидение типов (safe (guarded) typecast)

2) Слово "абстрактный" употреблено некорректно.


 
Sergey Masloff   (2003-05-10 11:50) [6]

Юрий Зотов ©
>3. Конечно, в смысле строгой терминологии используемой в Delphi >объектной модели, TObject абстрактным классом НЕ является. >Думаю, автору (или авторам) книги следовало бы быть более >аккуратными в подборе слов, дабы не запутывать читателей.
DiamondShark ©
>2) Слово "абстрактный" употреблено некорректно.

термин "абстрактный" применяется к TObject в документации Delphi. Так что автор, как минимум, имеет право на такой термин


 
DiamondShark   (2003-05-10 11:59) [7]


> термин "абстрактный" применяется к TObject в документации
> Delphi


А вы и ссылку дать можете?


 
Sergey Masloff   (2003-05-10 12:17) [8]

DiamondShark ©
>А вы и ссылку дать можете?
В Help слабо набрать TObject? Тогда цитирую:

Note: TObject is never directly instantiated. Although it does not use programming language features that prevent instantiation, TObject is an abstract class.




 
Sergey Masloff   (2003-05-10 12:21) [9]

DiamondShark ©
А вообще наш спор на пустом месте ;-))


 
Anatoly Podgoretsky   (2003-05-10 12:52) [10]

Ну не знаю, что у тебя за странный хелип, в моих Д1, Д3, Д6, Д6 написано

TObject is the ultimate ancestor for all other objects and components in Delphi.

Да и само применение этого термина по отношению к классу нне корректно. Эго применяли некоторое время, но потом перешили к более корректному Базовый Класс.


 
Sergey Masloff   (2003-05-10 12:56) [11]

Anatoly Podgoretsky ©
Delphi 7 Architect.
Правда, в Delphi 5 написано:
Note: While TObject is not technically an abstract class, objects of this type are not normally instantiated.


 
uw   (2003-05-10 13:09) [12]

>DiamondShark © (10.05.03 11:32)
>привидение типов (safe (guarded) typecast)

Пугающе звучит, лучше - прив едение :)


 
Anatoly Podgoretsky   (2003-05-10 13:48) [13]

Sergey Masloff (10.05.03 12:56)
Такая фраза есть, вот если бы ты ее указал, то было бы по другому. Хелп часто не исправляется. Но иногда наблюдается, в некоторых местах исправлено на Base Class

Ну а про отношение к термину "абстрактный класс" я уже сказал.
Мне нравится базовый класс, с абстрактными методами для посроения своих специализированных классов.


 
DiamondShark   (2003-05-10 17:01) [14]


> Sergey Masloff

Убедил.


 
kaif   (2003-05-10 17:13) [15]

По-моему мы здесь путаем понятия абстрактный класс и абстрактный метод.
Строго говоря, абстрактным классом следует называть не класс, все методы которого абстрактны (таких классов в общем-то не существует), а именно класс, экземпляры которого не предполагается создавать.
А вот отсутствие реализации тождественно абстрактности метода ибо только так и возможно создать метод, не имеющий реализации - объявив его абстрактным. Иначе компилятор просто руганется. На сегодня в Delphi методы могут быть статическими (которые не переопределяются), динамическими или виртуальными (которые переопределяются на стадии выполнения или компиляции) и абстрактными (частный случай динамических или виртуальных, не имеющих реализации на уровне класса, где они объявлены). Наверно так, если я ничего не напутал...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.019 c
3-94743
Minotavr
2003-05-08 19:16
2003.05.29
Firebird default character


3-94724
Guest1231231
2003-05-08 15:34
2003.05.29
row cannot be located for updating


1-94826
Ghost
2003-05-19 13:12
2003.05.29
Как вставить в image картинку из потока ?


1-94878
Анат
2003-05-19 18:09
2003.05.29
Gif формат


1-94854
sapsi
2003-05-20 08:00
2003.05.29
Обновление меток





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