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