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

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

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

Ответы [ 20 ]

107 голосов
/ 20 апреля 2009

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

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

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

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

//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 comparision
}
Для функции

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

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

Я всегда думаю о «типе» как о всеобъемлющем термине «классы» и «примитивы».

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

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

38 голосов
/ 04 августа 2014

По мотивам Википедии ...

В теории типов условия;

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

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

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

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

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

enter image description here

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

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

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

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

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

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

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

Если вы хотите, вы можете посмотреть на это так: тип является родительским понятием. Все остальные концепции: класс, интерфейс, структура, целое число и т. Д. Унаследованы от этой концепции. Т.е. это типы

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

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

Структура - это Тип, но Структура - это не Класс.

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

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

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

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

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

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

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

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

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

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

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

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

3 голосов
/ 02 декабря 2012

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

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

Python также добавляет метаклассы, которые являются просто механизмом для создания классов, точно так же, как классы создают объекты (и, конечно же, классы и метаклассы являются объектами).

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

2 голосов
/ 23 сентября 2016

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

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

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

Я хочу привести пример с использованием 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

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

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

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"

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

...