Чем отличается тип данных от класса?

zrab

В С++ можно написать
System::Int32 i = 1;
а можно
int i = 1;
чем эти 2 объявления отличаются? И зачем вообще тип данных, если есть классы (кроме удобства)?

katrin2201

класс - это полноценный класс со всеми вытекающими
primitive type - это вшитая в язык конструкция
не было бы примитивного инта, нельзя было бы написать класс-обертку
примитивные типы быстрее из-за отсутствия наворотов от класса

mkrec

и занимают меньше места (как минимум, за счет возможного выравнивания).
и совместимы

freezer

речь идёт о MC++? Насколько я понимаю, так int и System::Int32 - это одно и то же, и Int32 является не классом (который - reference-type а value-type

slonishka

> Чем отличается тип данных от класса?
В Haskell есть деление на классы и экземпляры (instance которого нет в ООП. Класс только определяет набор и сигнатуры методов, экземпляр только реализует их. Т. о. автоматически отпадает проблема множественного наследования. Классы не наследуют и не переопределяют методы других классов — каждый метод принадлежит только одному классу. Такой подход проще, чем сложная схема взаимоотношений классов в ООП. Некоторый тип данных может принадлежать нескольким классам; класс может требовать, чтобы каждый его тип обязательно принадлежал к другому классу, или даже нескольким; такое же требование может выдвигать экземпляр. Это аналоги множественного наследования. Есть и свойства, не имеющие аналогов в ООП. Например, реализация списков как экземпляра класса сравнимых величин требует, чтобы элементы списка также принадлежали к классу сравнимых величин.
%

karkar

class type и data type не перепутал? :)

apl13

Ч0?

slonishka

хз, я в этом вопросе теоретик.
но типы и классы в хаскелле же правда отличаются. я от этого офигел, когда узнал.

freezer

ну да, а в жаве/шарпе классы и интерфейсы отличаются. Чудеса, да?

slonishka

а класс там что такое?

evgarus

А в питоне никаких типов уже давно нету, все структурные единицы - объекты какого-либо класса :)
Очень удобно, но язык довольно-таки прожорливый (я про память).

slonishka

это немного другое, насколько я понимаю.
в хаскелле тип объекта получается композицией классов, которым он принадлежит.

freezer

Да вот ситуацияпочти такая же, как в Хаскеле, только терминология другая. Интерфейс задаёт контракт, класс - определяет реализацию.

karkar

Сорри, не class type, a type class:
http://en.wikipedia.org/wiki/Type_class
Короче, хаскеловские классы - это совсем не то, что в ООП привыкли называть классами. Это классы типов, а не классы объектов. Нечто, напоминающее интерфейсы в языках типа джавы.

karkar

В языках типа С++, джавы и шарпа так сложилось исторически - есть примитивные заранее определенные типы, и есть более сложные сущности - классы. Где-то это наследство С (в котором есть int, но нет class Int где-то - проявление архитектуры VM. В некоторых ОО языках, например Руби, такого разделения нет: все - классы.
Кроме того, ООП-теоретики указывали на различия между понятиями класса и типа, которые
проявляются при сравнении subtyping и subclassing..

slonishka

в таком случае, именно про разницу между typeclass и data type я и попытался написать.
в джаве вроде похоже, потому что объединять интерфейсы в одной реализации можно с помощью наследования.

slonishka

(там цитата не моя а с викибукс. сорри, если там что-то не так, я ее понял именно так, как ты потом объяснил).

evgarus

А есть в каком-нибудь ещё языке кроме питона такое понятие как метаклассы? Это типа конструктор классов, ну что-то вроде класса, объекты которого - классы.

freezer

template в C++? Generics в Java/C#? System.Type в .NET?

slonishka

ну вот в хаскелле классы — это такие штуки, объекты которых — типы.

karkar

>А есть в каком-нибудь ещё языке кроме питона такое понятие как метаклассы? Это типа конструктор классов, ну что-то вроде класса, объекты которого - классы.
В Руби есть нечто похожее, вроде.
Правда, сходство в основном в названии. :) Тут подробности:
http://mobcode.com/2006/12/22/charting-ruby-class-and-metacl...

evgarus

О боже мой, как я мог про шаблоны забыть :)
Про остальное вообще в первые слышу, надо будет почитать.

bleyman

В языках типа С++, джавы и шарпа так сложилось исторически - есть примитивные заранее определенные типы, и есть более сложные сущности - классы.
Untrue в отношении шарпа (и, практически наверняка, жавы).
typeof(int) == typeof(System.Int32)
Это просто алиас.
При этом System.Int32 есть структура, состоящая ровно из четырёх байтов и являющаяся сишным четырёхбайтным интом for all conceivable purposes. К этой структуре приписаны методы, как статические, так и instance. Static typing в сочетании с правилом structures are sealed (final) (в шарпе есть специальное словосочетание: value type) позволяет реализовать это без дополнительных затрат памяти на classId.
В жаве долгое время не было автоматического боксинга/анбоксинга, поэтому использовались два разных объявления, просто int, который попадал на стек (при объявлении локальной переменной) или непосредственно в структуру encapsulating class (при объявлении члена и другое, боюсь неправильно написать, которое описывало указатель на класс, содержащий инт. В шарпе как-то без этого обошлись, причём забавно, бокснутые инты в принципе существовали, а описывающий их тип появился только во второй версии.
Оставить комментарий
Имя или ник:
Комментарий: