В чем разница между типом и классом?

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

(В общем языке - агностический смысл)

Ответ 1

Следующий ответ взят из книги Gof (Design Patterns)

Класс объекта определяет, как объект реализуется. Класс определяет внутреннее состояние объекта и реализацию его операций.

Напротив, тип объекта относится только к его интерфейсу - на набор запросов, на которые он может ответить.

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

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

Для функции max требуется тип с операцией> со своим собственным типом, поскольку один из ее интерфейсов любого класса, который удовлетворяет вышеуказанному требованию, может использоваться для генерации конкретной функции max для этого класса.

Ответ 2

Я всегда думаю о "типе" в качестве зонтичного термина для "классов" и "примитивов".

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass

Ответ 3

Вдохновленный Wikipedia...

В теории типов;

  • Тип - абстрактный интерфейс.
    Типы обычно представляют существительные, такие как человек, место или предмет или что-то номинированное,

  • Класс представляет собой реализацию типа.
    Это конкретная структура данных и набор подпрограмм

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

    * Например, можно реализовать тип Stack с двумя классами: SmallStack (быстрый для небольших стеков, но плохо масштабируется) и ScalableStack (хорошо масштабируется, но с большими накладными расходами для небольших стеков). *

    Аналогично, данный класс может иметь несколько различных конструкторов .

enter image description here

Пример банана.

  • Тип A Banana будет представлять свойства и функциональность бананов в целом.

  • Классы ABCBanana и XYZBanana будут представлять способы создания бананов.
    (Различные поставщики бананов в реальной жизни или разные структуры данных и функции для представления и рисования бананов в видеоигре).

    Затем класс ABCBanana мог создавать определенные бананы, которые экземпляров класса ABCBanana, они будут объектами типа Banana.

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

Ответ 4

Тип - это общий термин для всех доступных шаблонов или концепций объектов. Класс является одним из таких шаблонов объектов. Так что тип структуры, тип Integer, тип интерфейса и т.д. Это все типы

Если вы хотите, вы можете посмотреть на него следующим образом: Тип - это родительская концепция. Все остальные понятия: класс, интерфейс, структура, целое и т.д. Унаследованы от этой концепции. I.e Они являются типами

Ответ 5

Тип содержит описание данных (т.е. свойств, операций и т.д.),

Класс - это определенный тип - это шаблон для создания экземпляров объектов.

Строго говоря, класс - это особое понятие, его можно рассматривать как пакет, содержащий подмножество metadata, описывающий некоторые аспекты объекта.

Например, в С# вы можете найти интерфейсы и классы. Оба они являются типами, но интерфейс может определять только определенный контракт и не может быть создан в отличие от классов.

Просто говорящий класс - это специализированный тип, используемый для инкапсуляции свойств и поведения объекта.

Википедия может дать вам более полный ответ:

Ответ 6

Чтобы проиллюстрировать это, самый быстрый способ:

A Struct - это тип, но Struct не является классом.

Как вы можете видеть, Type является "абстрактным" термином для не только определений классов, но также структур и примитивных типов данных, таких как float, int, bool.

Ответ 7

Тип концептуально является надмножеством класса. В более широком смысле класс является одной из форм типа.

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

Таким образом, "тип" включает классы, интерфейсы и в большинстве примитивов языков. Также платформы, такие как dot-net CLR, также имеют типы структуры.

Ответ 8

Мои мысли в значительной степени соответствуют ответу аку.

Я рассматриваю классы как шаблон для создания объектов, а типы - способ классифицировать эти объекты и предоставлять нам интерфейс для них.

Python также добавляет метаклассы, которые являются всего лишь механизмом для создания классов, таким же образом, как и классы, создающие объекты (и ну, классы и метаклассы - оба объекта).

Этот ответ на тот же вопрос в lamba, как мне кажется, идеальное объяснение.

Ответ 9

Взято из цитаты GoF снизу:

Объекты class определяют, как объект реализован. Класс определяет внутреннее состояние объекта и реализации операции.

Напротив, объекты тип относится только к его интерфейсу - набор запросов, на которые он может ответить.

Я хочу привести пример с помощью Java:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

Оба класса A и B реализуют интерфейс и, следовательно, имеют тип IType. Кроме того, в Java оба класса производят собственный тип (соответственно их имя класса). Таким образом, класс A имеет тип A и IType, а класс B имеет тип B и IType, удовлетворяющий:

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

Разница между подтипами и подклассом, вероятно, также помогает понять эту проблему:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

Ответ 10

Чтобы добавить еще один пример различия: в С++ у вас есть указатели и ссылочные типы, которые могут ссылаться на классы, но сами по себе не являются классами.

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

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

Ответ 11

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

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

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

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

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

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

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

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

Ответ 15

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

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

  • Операции = синтаксис
  • Описание операций = семантика

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

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

Некоторые примечания:

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

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

Ответ 16

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

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

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

Ответ 17

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

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

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

  • Простые типы: например, int, long, float и т.д.
  • Типы перечислений
  • Типы структуры
  • Невозможные типы

Типы ссылок:

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

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

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

Referece: CSahrp Language Specification doc, стр. 4

Ответ 18

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

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

Наоборот, например, в контексте С# - класс только один из многих других реализаций концепции типа, как примитивы, структуры, указатели и т.д.

Ответ 19

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

Ответ 20

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

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

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

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

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