В чем разница между типом и классом? - PullRequest
130 голосов
/ 22 января 2009

Что отличает тип от класса и наоборот?

(в общеязыковом смысле)

Ответы [ 20 ]

1 голос
/ 22 января 2009

Я думаю о типе как о множестве вещей, которые вы можете сделать с определенным значением. Например, если у вас есть целочисленное значение, вы можете добавить его к другим целым числам (или выполнить другие арифметические операции) или передать его функциям, которые принимают целочисленный аргумент. Если у вас есть значение объекта, вы можете вызывать методы, которые определены его классом.

Поскольку класс определяет, что вы можете делать с объектами этого класса, класс определяет тип. Класс - это нечто большее, поскольку он также предоставляет описание того, как реализованы методы (что-то, что не подразумевается типом) и как размечаются поля объекта.

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

Так что, хотя объекты и типы тесно связаны, на самом деле это не одно и то же.

1 голос
/ 22 января 2009

Тип обычно относится к классификации примитивных значений - целых чисел, строк, массивов, логических значений, значений NULL и т. Д. Обычно вы не можете создавать новые типы.

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

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

1 голос
/ 22 января 2009

Типы и классы связаны, но не идентичны. Я предполагаю, что классы используются для наследования реализации, тогда как типы используются для замены во время выполнения.

Здесь - это ссылка, объясняющая принцип подстановки и почему подклассы и подтипы не всегда одно и то же (например, в Java). Страница wikipedia по ковариации и контравариантности содержит больше информации об этом различии.

0 голосов
/ 16 апреля 2019

Типы в C, такие как Int Float, char и т. Д., Определяют данные, к которым можно обращаться с помощью определенных методов, которые могут работать с ними. Это не сложнее, чем это. Как для int я могу добавить, вычесть умножить и, возможно, делить. Это мои методы (или операции) для int. Класс - это просто определение нового типа. Сначала я определяю, как выглядят данные. Может быть, это один бит. Может быть, это два слова, как комплекс с реальной и мнимой частью. Или, может быть, это сложная штука с 309734325 байтами, представляющими атомную структуру странной частицы на Юпитере. Мне все равно Как целое число, я выполняю операции, которые могу выполнять с этим новым типом данных. В случае целого числа, которое я добавил, вычел и т. Д. С помощью этого нового типа данных я могу определить любые операции, которые я считаю целесообразными. Они могут быть добавлены вычитать и т.д., но они могут добавить другие вещи. Это те методы, которые я решу добавить в свой класс.

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

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

Классы просто дают вам гибкость в определении новых типов и всего того, как они работают.

Как только это определено, каждый раз, когда я создаю экземпляр объекта класса "thingy", он имеет определенную мной структуру данных и операции (методы), которые, как я сказал, вы можете делать с ним. Класс "вещь" явно не более, чем новый тип, который C ++ позволяет мне определять.

0 голосов
/ 31 марта 2019

Это был хороший вопрос для меня, который заставил меня задуматься. Я бы осмелился сказать, что Class - это штука во время компиляции, а Type - штука во время выполнения. Я говорю это потому, что вы пишете классы, а не типы. Затем компилятор создает типы из классов, а среда выполнения использует типы для создания экземпляров объектов.

0 голосов
/ 27 февраля 2019

In общий язык-независимый смысл - Класс - это реализация Типа .

Часто, когда это реализация only этого типа, вы можете использовать оба термина для ссылки на нее в некотором контексте.

Напротив, например, в контексте C # - Класс это просто один из многих других реализаций из Тип понятие, такое как примитивы, структуры, указатели и т. Д.

0 голосов
/ 11 января 2014

Если мы подумаем над этим вопросом в контексте C #, мы дойдем до следующего ответа.

Система

C # подразделяется на следующие категории:

Типы значений:

  • Простые типы: например, int, long, float и т. Д.
  • Типы перечислений
  • Типы конструкций
  • Обнуляемые типы

Типы ссылок:

  • Типы классов
  • Типы интерфейсов
  • Типы массивов
  • Типы делегатов

Как вы можете видеть, в C # существует много типов, класс которых является только одним из них. Есть только одно важное замечание: Система типов C # унифицирована так, что значение любого типа может рассматриваться как объект. Каждый тип в C # прямо или косвенно происходит от типа класса объекта, а объект является основным базовым классом всех типов. Значения ссылочных типов обрабатываются как объекты, просто просматривая значения как объект типа. Значения типов значений обрабатываются как объекты путем выполнения операций упаковки и распаковки.

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

Ссылка: документация по спецификации языка CSahrp, стр. 4

0 голосов
/ 25 ноября 2013

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

Даже в таких языках, как Java, int является (примитивным) типом, но не классом.

Следовательно: каждый класс является типом, но не каждый тип является классом.

0 голосов
/ 16 июля 2011

Различные классы могут описывать один и тот же тип.

Тип состоит из следующих частей:

  1. Операции = синтаксис
  2. Описание операций = семантика

Класс состоит из следующих частей:

  1. Операции = синтаксис
  2. Реализация (= различные реализации описывают одну и ту же семантику)

Некоторые заметки:

  • Интерфейс (как в Java) не является типом, потому что он не описывает семантику (описывает только синтаксис)

  • Подкласс не является подтипом, поскольку подкласс может изменить семантику, определенную в суперклассе, подтип не может изменить семантику супертипа (см. Принцип замены Лискова, например, этот пример LSP ).

0 голосов
/ 22 января 2009

Интересный вопрос. Я думаю, что ответ аку на месте. Возьмем для примера класс java ArrayList

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Экземпляр класса ArrayList называется типом каждого расширяемого им суперкласса и каждого реализуемого им интерфейса. Следовательно, экземпляр класса ArrayList имеет тип ArrayList, RandomAccess, Cloneable и т. Д. Другими словами, значения (или экземпляры) принадлежат одному или нескольким типам, классы определяют, что это за типы.

...