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


Ответы:


122

Следующий ответ взят из книги 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 для этого класса.


56

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

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

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


7
приятное и лаконичное объяснение :)
Аку

3
Ну, в .NET должно быть то же самое, даже примитивы являются классами (или, точнее, структурами).
Dalle

4
@dalle: согласен, между типом и классом нет никакой разницы. Пример Эдди сильно зависит от C ++ / Java. Это совсем не определение.
Роберт Гулд

Я предполагаю, что будет трудно получить «определение» «тип» против класса. У многих языков есть своя система ввода текста. Одно из определений, которое я услышал для .NET, было то, что «тип» включает в себя оба типа ref и value, тогда как класс используется только для описания типов ref.
Эдди Паркер

2
Разве int - это не просто сокращение от System.Int32? Другими словами: int foo; // Тип int, класс System.Int32?
Свиш

51

Вдохновленный Википедией ...

В терминах теории типов ;

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

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

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

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

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

введите описание изображения здесь

Банановый пример.

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

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

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

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


3
Как кто-то, кто изо всех сил пытается учиться, если не привести реальный пример, это действительно очень помогло мне. Спасибо.
alexc95

13

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

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


4

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

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

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

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

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

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


4

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

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

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


2
Было бы хорошо упомянуть .net CLR в качестве примера структуры, в которой существуют типы, которые не являются классами (Java можно назвать другой, хотя .net имеет больше видов типов). Однако дополнительная мелочь в .net заключается в том, что Type(с заглавной буквы, как показано) это краткое имя системного класса ( System.Type), которое используется для хранения описаний типов.
Суперкат

3

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

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

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


rajKumar, ваш вопрос довольно двусмысленный. Вы относитесь к «типу» как к признаку какого-либо языка или как к общему понятию?
Аку

Однако не все пользовательские типы являются классами, по крайней мере, не во всех языках.
Джалф

Джальф, согласись, это неправильные характеристики. Интерфейс также определяется пользователем, и не может быть пользовательских типов. Класс специализированного типа обслуживание особых потребностей (создание экземпляров объектов)
Аку

Интерфейс - это просто специальный тип, чисто абстрактный класс - это все же тип (в более широком смысле).
Лоуренс Дол

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

3

Чтобы добавить еще один пример различия: в 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"

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


3

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

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

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

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


3

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

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

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

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

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

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

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

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


2

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

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

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

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

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


1

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

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

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


1
Даже в обедневшем языке типов C вы можете создавать новые типы, но он не имеет ничего общего с тем, о чем люди обычно думают как о классах, за исключением того, что структуры, записи и классы в некотором роде похожи друг на друга.
Джеймс Айри

1

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

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


1

В общем языке агностиком смысле - класс является реализация в Type .

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

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


0

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

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

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


0

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

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

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

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

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

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

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

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


0

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

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

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


0

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

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

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

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

Типы ссылок:

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

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

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

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


-1

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


1
Добро пожаловать в ТАК. Этот ответ очень похож по крайней мере на одного другого, и пользователи SO предпочитают более технический язык, чем «штуковина»!
Ник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.