Теоретическая разница между классами и типами - PullRequest
0 голосов
/ 15 февраля 2012

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

Большинство ответов что-то вроде "У класса есть реализации для методов, на которые могут реагировать его объекты, в то время как тип просто указывает , на какие методы можно ответить ".

Что ж, мне кажется, что это странное определение,Возьмите целые числа, числа с плавающей запятой и символы в языке, подобном C. Он никогда не может быть явно расположен в коде, но в язык, безусловно, встроены методы для ответа на сообщения («плюс», «минус» и т. Д.)что эти типы получают.

И поскольку все интерфейсы должны иметь методы, определенные где-то , мне кажется, что типы - это то же самое, что и классы, за исключением того, что слово "класс" несет мысленный образболее существенной структуры программирования, чем «тип».

Что заставляет меня полагать, что недостатки, применимые к любому языку на основе классов (например, «проблема выражений»), аналогичным образом применимы к любому языкус типами (Haskell и др.)

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

Широко применимого, общепринятого определения термина "класс", о котором я знаю, даже систем типа. Так что ваш вопрос во многом зависит от контекста.

Если вы говорите о классах на объектно-ориентированных языках, то приведенное вами описание является относительно точным. Типы - это спецификации, описания (объектов или других значений). Классы являются реализациями, определениями (объектных фабрик).

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

В любом случае причина, по которой различие, по-видимому, расходится с целыми числами и числами с плавающей точкой в ​​C, проста: это не объекты. Несмотря на то, что идеология ОО пытается проповедовать, не все является объектом, и уж точно не на каждом языке.

0 голосов
/ 11 июля 2013

«Класс» и «тип» означают разные вещи в разных языках и средах;Я попытаюсь показать здесь синтез, который помогает мне думать о проблеме.

У классов есть объекты, а у типов есть значения.Я думаю, что легче понять разницу между объектами и значениями, чем между классами и типами.Объект имеет 2 независимых свойства: его идентичность и его состояние / поведение.Таким образом, вы можете иметь два разных объекта с одинаковым классом и состоянием.Это не относится к значениям: у вас не может быть двух разных значений типа, которые имеют одинаковое состояние (или форму, форму) и поведение: у вас не может быть двух «двоих».Значение типа не имеет идентичности, независимой от его состояния и поведения.

Смешивая оба понятия вместе, вы можете сказать, что значение данного типа не обязательно имеет класс, но объект объектаданный класс обязательно имеет тип (например, объект), и его значение задается как его состоянием / поведением, так и его идентичностью.

У Haskell есть типы и определяемые, если я прав.Именно из Haskell я использую концепцию типа, которую я использую.Python имеет классы и типы, смешанные в одной системе типов, с некоторыми примитивными типами и богатыми определяемыми классами.Концепция объекта, который я использую, - это система типов Python, за исключением его примитивных типов: int, str и т. Д.

Еще одно ключевое отличие между типами и классами заключается в их определении.Типы типично определяются набором предикатов или ограничений, которые «дают» сразу все значения типа.Таким образом, вы можете использовать буквальное значение без необходимости его «создания»: 23438573. Определение класса включает в себя процедуру создания объектов, и все объекты этого класса должны быть созданы до того, как они будут использованы.

0 голосов
/ 15 февраля 2012

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

Хотя верно, что где-то для типа могут быть указаны методы, будет только один способ изменить данные, содержащиеся в экземпляре типа, - сохранить в нем новое значение. Методы, как правило, основаны на представлении данных различными способами, вместо того, чтобы фактически манипулировать данными.

Это правило, конечно, может быть нарушено; C полон примеров, из-за того, как он структурирован (или, скорее, не структурирован). Вообще говоря, вы не хотите иметь тип с функцией, которая выполняет внутреннюю причудливую логику.

...