Ответы:
Следующий ответ взят из книги 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 для этого класса.
Я всегда думаю о «типе» как о всеобъемлющем термине «классы» и «примитивы».
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Вдохновленный Википедией ...
В терминах теории типов ;
Тип является абстрактным интерфейсом.
Типы, как правило, представляют собой существительные, такие как человек, место или вещь, или что-то номинализованное,
Класс представляет собой реализацию типа.
Это конкретная структура данных и набор подпрограмм
Различные конкретные классы могут создавать объекты одного абстрактного типа (в зависимости от системы типов).
* Например, можно реализовать тип Stack
с двумя классами : SmallStack
(быстро для небольших стеков, но плохо масштабируется) и ScalableStack
(хорошо масштабируется, но с большими накладными расходами для небольших стеков). *
Точно так же данный класс может иметь несколько разных конструкторов .
Банановый пример.
Banana
Тип будет представлять свойства и функциональность бананов в целом.
ABCBanana
ИXYZBanana
классы будут представлять способы производства бананов.
(Различные поставщики бананов в реальной жизни, или разные структуры данных и функции для представления и рисования бананов в видеоигре).
ABCBanana
Класс может затем производить определенные бананы , которые являются экземплярами этогоABCBanana
класса , они были бы объекты из типа банана .
Нередко программист предоставляет единственную и единственную реализацию для типа. В этом случае имя класса часто совпадает с именем типа . Но есть еще тип (который может быть извлечен в интерфейсе, если требуется) и реализация (которая реализует отдельный интерфейс), которая создает экземпляры (объекты) класса.
Тип - это общий термин для всех доступных шаблонов объектов или концепций. Класс является одним из таких шаблонов объектов. Как и тип структуры, тип Integer, тип интерфейса и т. Д. Это все типы
Если вы хотите, вы можете посмотреть на это так: тип является родительским понятием. Все остальные понятия: класс, интерфейс, структура, целое число и т. Д. Унаследованы от этого понятия.
Тип содержит описание данных (т.е. свойства, операции и т. Д.),
Класс - это особый тип - это шаблон для создания экземпляров объектов .
Строго говоря, класс - это особая концепция, его можно рассматривать как пакет, содержащий подмножество метаданных, описывающих некоторые аспекты объекта.
Например, в C # вы можете найти интерфейсы и классы. Оба они являются типами, но интерфейс может определять только некоторый контракт и не может быть создан в отличие от классов.
Проще говоря, класс - это специализированный тип, используемый для инкапсуляции свойств и поведения объекта.
Википедия может дать вам более полный ответ:
Чтобы проиллюстрировать это самым быстрым способом:
Структура - это Тип, но Структура - это не Класс.
Как видите, тип - это «абстрактный» термин для обозначения не только определений классов, но также структур и примитивных типов данных, таких как float, int, bool.
Type
(с заглавной буквы, как показано) это краткое имя системного класса ( System.Type
), которое используется для хранения описаний типов.
Тип концептуально является надмножеством класса. В более широком смысле класс является одной из форм типа.
С классами тесно связаны интерфейсы, которые можно рассматривать как особый класс - чисто абстрактный. Это тоже типы.
Таким образом, «тип» охватывает классы, интерфейсы и в большинстве языков примитивы тоже. Кроме того, платформы, такие как CLR в dot-net, также имеют структурные типы.
Чтобы добавить еще один пример различия: в 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"
Обратите внимание, что задействован только один класс, но можно использовать почти бесконечное количество типов. В некоторых языках функции считаются объектами первого класса, и в этом случае тип функции является классом. В других тип функции является просто указателем. Классы, как правило, имеют концепцию способности хранить данные, а также операции с этими данными.
Мои мысли в значительной степени соответствуют ответу Аку.
Я рассматриваю классы как шаблон для создания объектов, а типы - это способ классификации этих объектов и предоставления нам интерфейса к ним.
Python также добавляет метаклассы, которые являются просто механизмом для создания классов, точно так же, как классы создают объекты (и хорошо, и классы, и метаклассы являются объектами).
Этот ответ на тот же вопрос в Lamba Ultimate кажется мне идеальным объяснением.
Взято из цитирования 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
Я думаю о типе как о множестве вещей, которые вы можете сделать с определенным значением. Например, если у вас есть целочисленное значение, вы можете добавить его к другим целым числам (или выполнить другие арифметические операции) или передать его функциям, которые принимают целочисленный аргумент. Если у вас есть значение объекта, вы можете вызывать методы, которые определены его классом.
Поскольку класс определяет, что вы можете делать с объектами этого класса, класс определяет тип. Класс - это нечто большее, поскольку он также предоставляет описание того, как реализованы методы (что-то, что не подразумевается типом) и как размечаются поля объекта.
Также обратите внимание, что значение объекта может иметь только один класс, но оно может иметь несколько типов, поскольку каждый суперкласс предоставляет подмножество функциональных возможностей, доступных в классе объекта.
Таким образом, хотя объекты и типы тесно связаны, они на самом деле не одно и то же.
Типы в C, такие как Int Float, char и т. Д., Определяют данные, на которые можно воздействовать определенными методами, которые могут работать с ними. Это не сложнее, чем это. Как и для int я могу добавить, вычесть умножить и, возможно, делить. Это мои методы (или операции) для int. Класс - это просто определение нового типа. Сначала я определяю, как выглядят данные. Может быть, это один бит. Может быть, это два слова, как комплекс с реальной и мнимой частью. Или, может быть, это сложная штука с 309734325 байтами, представляющими атомную структуру странной частицы на Юпитере. Мне все равно Как целое число, я выполняю операции, которые я могу выполнять с этим новым типом данных. В случае целого числа, которое я добавил, вычел и т. Д. С этим новым типом данных я могу определить любые операции, которые я считаю целесообразными. Они могут быть добавлены вычитать и т. Д. но они могут добавить другие вещи. Это те методы, которые я решил добавить в свой класс.
Суть в том, что с типом в C у вас есть определение того, что это за данные, т.е. байт, слово, число с плавающей запятой, символ и т. д. Но любой из них также подразумевает, какие операции являются законными и будут давать надежные результаты.
Класс ничем не отличается, кроме вас самих определить интерфейс и допустимые операции. Класс определяет эти вещи, и когда вы создаете его экземпляр в Object, он определяет поведение объекта так же, как определение типа определяет поведение целого числа при работе с ним.
Классы просто дают вам возможность определять новые типы и все о том, как они работают.
Как только это определено, каждый раз, когда я создаю экземпляр объекта класса "thingy", он имеет определенную мной структуру данных и операции (методы), которые, как я сказал, вы можете делать с ним. Класс "вещь" явно не более или менее, чем новый тип, который C ++ позволяет мне определять.
Тип обычно относится к классификации примитивных значений - целых чисел, строк, массивов, логических значений, значений NULL и т. Д. Обычно вы не можете создавать какие-либо новые типы.
Класс относится к именованному набору свойств и методов, с которым связан объект при его создании. Обычно вы можете определить столько новых классов, сколько захотите, хотя в некоторых языках вам нужно создать новый объект, а затем присоединить к нему методы.
Это определение в основном верно, но некоторые языки пытались комбинировать типы и классы различными способами, что приводило к различным полезным результатам.
Типы и классы связаны, но не идентичны. Я предполагаю, что классы используются для наследования реализации, тогда как типы используются для замены во время выполнения.
Вот ссылка, объясняющая принцип подстановки и почему подклассы и подтипы не всегда одно и то же (например, в Java). Страница википедии о ковариации и контравариантности содержит больше информации об этом различии.
В общем языке агностиком смысле - класс является реализация в Type .
Часто, когда это единственная реализация этого типа, вы можете использовать оба термина для ссылки на него в некотором контексте.
Наоборот, например, в контексте C # - класс только один из многих других реализаций одного типа понятия , как примитивы, структуры, указатели и т.д.
Интересный вопрос. Я думаю, что ответ аку на месте. Возьмите Java- ArrayList
класс в качестве примера
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
Говорят, что экземпляр класса относится к типу каждого расширяемого им суперкласса и каждого реализуемого им интерфейса. Таким образом, экземпляр ArrayList
класса имеет тип ArrayList
, RandomAccess
, Cloneable
и так далее. Другими словами, значения (или экземпляры) принадлежат одному или нескольким типам, классы определяют, что это за типы.
Различные классы могут описывать один и тот же тип.
Тип состоит из следующих частей:
Класс состоит из следующих частей:
Некоторые заметки:
Интерфейс (как в Java) не является типом, потому что он не описывает семантику (описывает только синтаксис)
Подкласс не является подтипом, потому что подкласс может изменить семантику, определенную в суперклассе, подтип не может изменить семантику супертипа (см. Принцип замещения Лискова, например, этот пример LSP ).
Очевидно, что, поскольку есть языки с системой типов, которые не являются языками программирования ОО, тип должен быть более широким понятием, чем класс.
Даже в таких языках, как Java, int
это (примитивный) тип, но не класс.
Следовательно: каждый класс является типом, но не каждый тип является классом.
Если мы подумаем над этим вопросом в контексте C #, мы дойдем до следующего ответа.
Система типов C # подразделяется на следующие категории:
Типы значений:
Типы ссылок:
Как вы можете видеть, в C # существует много типов, класс которых является только одним из них. Есть только одно важное замечание: система типов C # унифицирована так, что значение любого типа может рассматриваться как объект. Каждый тип в C # прямо или косвенно происходит от типа класса объекта, а объект является основным базовым классом всех типов. Значения ссылочных типов обрабатываются как объекты, просто просматривая значения как объект типа. Значения типов значений обрабатываются как объекты путем выполнения операций упаковки и распаковки.
так что, как я вижу, type является зонтиком для многих элементов, класс которых является одним из них.
Ссылка: Документация по спецификации языка CSahrp, стр. 4
Это был хороший вопрос для меня, который заставил меня задуматься. Я бы осмелился сказать, что Class - это штука во время компиляции, а Type - штука во время выполнения. Я говорю это потому, что вы пишете классы, а не типы. Затем компилятор создает типы из классов, а среда выполнения использует типы для создания экземпляров объектов.