Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 351 352 [353] 354 355 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5281
,
|
|
|
|
D_KEY, посмотри на Питон, там ван Россум вообще напрасно в дебри полез:
isinstance(object, type) = True isinstance(type, object) = True isinstance(object, object) = True Это тебя не смущает? ЗАйдем с друго стороны. Хорошо, пусть есть запрос типа, typeof, и он выдает при вызове typeof(integer) -> type, как тебе кажется логичным. Что выдаст typeof(type)? |
|
Сообщ.
#5282
,
|
|
|
|
Цитата Romkin @ Ерунда. Элементарная логика подсказывает, что, например в Delphi 1. Любой класс порождается от TObject 2. TObject - класс. Истинность TObject.InheritsFrom(TObject) логично. Точно так же каждый класс замкнут сам на себя, является экземпляром своего типа. И суперкласс type не нужен. элементарная логика подсказывает, что наследование и определение типа -- не одно и то же. и класс не является экземпляром своего типа, иначе класс содержал бы все те же поля и методы, что и его экземпляры. Цитата Romkin @ НУ вот. На каком основании метод класса должен давать разные результаты при вызове из самого класса и экземпляра этого класса? в смысле? он как раз дает одинаковые результаты. ![]() ![]() typeof(1) -> Integer typeof(Integer) -> Type typeof(typeof(1)) -> Type равносильно 1.getType -> Integer Integer.getType -> Type 1.getType.getType -> Type если же у вас отсутствуют метатипы, то выражение typeof(Integer) вообще не имеет смысла |
|
Сообщ.
#5283
,
|
|
|
|
Цитата korvin @ равносильно 1.getType -> Integer Integer.getType -> Type 1.getType.getType -> Type Замечательно. И что же такое type? Класс? Цитата korvin @ и класс не является экземпляром своего типа, иначе класс содержал бы все те же поля и методы, что и его экземпляры. А type, значит, является экземпляром своего типа. И содержит все поля и методы всех своих экземпляров? Добавлено korvin, что выдает type.getType? |
|
Сообщ.
#5284
,
|
|
|
|
Цитата Romkin @ ЗАйдем с друго стороны. Хорошо, пусть есть запрос типа, typeof, и он выдает при вызове typeof(integer) -> type, как тебе кажется логичным. Что выдаст typeof(type)? это ты не "с другой стороны зашел", а результат typeof(type) может выдать либо ошибку, либо type в зависимости от реализации языка. и оба варианта будут логичными, а возврат typeof(integer) -> integer, в языке, где нет метатипизации и каждый тип зациклен на сам себя -- просто бессмысленно. именно поэтому в Oxygen и case требует ключевого слова type, чтобы отличать значения от типов. хотя и это непонятно, как буд-то компилятор не может отличить имя типа от переменной |
|
Сообщ.
#5285
,
|
|
|
|
Цитата korvin @ а результат typeof(type) может выдать либо ошибку, либо type в зависимости от реализации языка. и оба варианта будут логичными, а возврат typeof(integer) -> integer, в языке, где нет метатипизации и каждый тип зациклен на сам себя -- просто бессмысленно. Э, нет. 1. type.getType выдает ошибку. Но getType - атрибут любого типа, и если его нет, то type типом не является и не может быть выдан как результат getType. 2. Выдает опять type. Почему? И чем type.getType -> Type отличается от случая integer.getType -> integer? Добавлено Цитата korvin @ именно поэтому в Oxygen и case требует ключевого слова type, чтобы отличать значения от типов. хотя и это непонятно, как буд-то компилятор не может отличить имя типа от переменной Там в case стоит экземпляр! И указываетя, что нужно получить его тип! не было бы type of - не скомпилировалось бы, из-за несоответствия типа. Добавлено Цитата korvin @ а возврат typeof(integer) -> integer, в языке, где нет метатипизации и каждый тип зациклен на сам себя -- просто бессмысленно. Поясни. |
|
Сообщ.
#5286
,
|
|
|
|
Цитата Romkin @ Это тебя не смущает? тут почти все в порядке, но это не тоже самое, что писал ты для Delphi. |
|
Сообщ.
#5287
,
|
|
|
|
Цитата D_KEY @ тут почти все в порядке, но это не тоже самое, что писал ты для Delphi. Да что ты? Поясни, нафиг в Питоне type? Что, object - это не экземпляр своего типа? Дык вроде isinstance(object, object) истинно. |
|
Сообщ.
#5288
,
|
|
|
|
Цитата Romkin @ А type, значит, является экземпляром своего типа. И содержит все поля и методы всех своих экземпляров? korvin, что выдает type.getType? да, он может им быть т.к. экземплярами type являются типы и сам type является типом, то он может являться экземпляром самого себя. но экземплярами integer являются числа. является ли тип integer числом? и если типом integer является integer, то что вернет выражение (1 + integer)? Добавлено Цитата Romkin @ Цитата korvin @ а возврат typeof(integer) -> integer, в языке, где нет метатипизации и каждый тип зациклен на сам себя -- просто бессмысленно. Поясни. а что тут поянять? какой смысл в функции ![]() ![]() typeof :: a -> a ? при том, что операций над типами там не много, как ее использовать и зачем? |
|
Сообщ.
#5289
,
|
|
|
|
Цитата korvin @ и если типом integer является integer, то что вернет выражение (1 + integer)? Э, тут ты складываешь тип с экземпляром, однако ![]() Цитата korvin @ экземплярами type являются типы и сам type является типом, то он может являться экземпляром самого себя. но экземплярами integer являются числа. Последний шаг: typeof не указывает экземпляром чего является аргумент, ты опять путаешь с isinstance. Он выдает именно тип аргумента. Просто нельзя сказать, что тип является экземпляром какого-то другого типа, и все. Он является типом, не объектом. Добавлено Цитата korvin @ ? при том, что операций над типами там не много, как ее использовать и зачем? Потому что ссылка на тип может быть подана. И именно в дженерике она и подается, там стоит typeof(T). А typeof(integer) никому и не надо, результат и так понятен. Точно также как тебе не надо type.getType, с тем же результатом. Здесь просто замыкание на себя на ступеньку раньше, поскольку type - излишняя сущность, если ты не можешь создать одновременно два разных типа integer. |
|
Сообщ.
#5290
,
|
|
|
|
Цитата Romkin @ Там в case стоит экземпляр! И указываетя, что нужно получить его тип! не было бы type of - не скомпилировалось бы, из-за несоответствия типа. т.е. вот тут: ![]() ![]() case aClass type of TMyXYZClass: TMyXYZClass(aClass).DoSomething; TMyOtherClass: TMyOtherClass(aClass).DoSomethingElse; else raise new Exception('Неправильная ссылка на класс'); aClass -- это экземпляр? еще лучше, зачем нам ООП, наследование, полиморофизм, если у нас есть крутой case? Добавлено Цитата Romkin @ Э, тут ты складываешь тип с экземпляром, однако ![]() так ты определись, типом integer является integer или все-таки что-то другое? Добавлено Цитата Romkin @ Последний шаг: typeof не указывает экземпляром чего является аргумент, ты опять путаешь с isinstance. Он выдает именно тип аргумента. Просто нельзя сказать, что тип является экземпляром какого-то другого типа, и все. Он является типом, не объектом. нет, это ты путаешь. isinstance -- это двуместный предикат, возвращающий истину, если первый аргумент является экземпляром второго аргумента, а typeof -- это одноместный селектор, возвращающий тип своего аргумента |
|
Сообщ.
#5291
,
|
|
|
|
Цитата korvin @ так ты определись, типом integer является integer или все-таки что-то другое? Да. А 1 - это не тип, это экземпляр этого типа. Сущности разные. Цитата korvin @ aClass -- это экземпляр? еще лучше, зачем нам ООП, наследование, полиморофизм, если у нас есть крутой case? Ой. Судя по эксепшену все-таки класс. Тогда действительно непонятно слово type. Добавлено Цитата korvin @ нет, это ты путаешь. isinstance -- это двуместный предикат, возвращающий истину, если первый аргумент является экземпляром второго аргумента, а typeof -- это одноместный селектор, возвращающий тип своего аргумента А что, типа 1.isinstance(integer) - такой реализации быть не может вообще? |
|
Сообщ.
#5292
,
|
|
|
|
Цитата Romkin @ Просто нельзя сказать, что тип является экземпляром какого-то другого типа, и все. поправка: в Oxygen нельзя |
|
Сообщ.
#5293
,
|
|
|
|
Цитата korvin @ поправка: в Oxygen нельзя И нафиг не надо. Вот беру я Питон, благо стоит: ![]() ![]() >>> object.__class__ <class 'type'> >>> object.__class__.__class__ <class 'type'> >>> object.__class__.__class__.__class__ <class 'type'> И втыкаешь... Вот в Delphi остановились на том, что классом object является object, а не какой-то мифический type, у которого есть все что и у object, но он им не является. |
|
Сообщ.
#5294
,
|
|
|
|
Цитата Romkin @ И втыкаешь... Вот в Delphi остановились на том, что классом object является object, а не какой-то мифический type, у которого есть все что и у object, но он им не является. Если бы в Delphi были метаклассы, ты бы понял... |
|
Сообщ.
#5295
,
|
|
|
|
кстати в джаве можно:
![]() ![]() if (Integer.class instanceof Class) { System.out.println("Integer is a Class"); } Добавлено Цитата Romkin @ Да. А 1 - это не тип, это экземпляр этого типа. Сущности разные. супер. и 1 и integer являются экземпляроми integer, но при этом разные сущности. логичность так и прет |