В чем разница между типом и классом?
Что отличает тип от класса и наоборот?
(В общем языке-агностический смысл)
17 ответов
следующий ответ из книги Gof (шаблоны проектирования)
объекта класс определяет, как объект реализован .Класс определяет внутреннее состояние объекта и осуществление его оперативный.
напротив, объект тип относится только к его интерфейсу-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 для этого класса.
Я всегда думаю о "типе" как зонтичном термине для "классов" и "примитивов".
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
вдохновленный Википедия...
на теория условия;
A тип является абстрактным интерфейсом.
Типы обычно представляют существительные, такие как человек, место или вещь, или что-то номинализованное,-
A класс представляет реализацию типа.
Это конкретная структура данных и набор подпрограммразличные конкретные классы могут создавать объекты того же абстрактного типа (в зависимости от типа системы).
*например, можно реализовать тип
Stack
с классы:SmallStack
(быстро для небольших стеков, но плохо масштабируется) иScalableStack
(Весы хорошо, но высокие накладные расходы для малых стеков).*аналогично, данный класс может иметь несколько разных конструкторы.
примере банана.
A
Banana
тип будет представлять свойства и функциональность бананов в целом.на
ABCBanana
иXYZBanana
классы будет представлять собой способы производства бананов.
(Различные поставщики бананов в реальной жизни или различные структуры данных и функции для представления и рисования бананов в видеоигре).The
ABCBanana
класс смог после этого произвести определенные бананы которые экземпляров наABCBanana
класс они будут объекты of тип банан.
не редко программист предоставляет единственную и единственную реализацию для типа. В этом случае класс имя часто совпадает с имя типа. Но есть еще тип (который при необходимости может быть извлечен в интерфейсе) и реализация (которая будет реализовывать отдельный интерфейс), которая строит экземпляры (объекты) класса.
Type-это общий термин для всех доступных шаблонов или концепций объектов. Класс-это один из таких шаблонов объектов. Таков тип структуры, целочисленный тип, тип интерфейса и т. д. Это все типы
Если хотите, вы можете посмотреть на это так: тип-это родительская концепция. Все остальные понятия: класс, интерфейс, структура, целое число и т. д. наследуются от этого понятия.я.есть несколько видов
тип содержит описание данных (т. е. свойств, операций и т. д.),
класс-это определенный тип - это шаблон для создания экземпляров объекты.
строго говоря, класс-это специальное понятие, его можно рассматривать как пакет, содержащий подмножество метаданных описание некоторых аспектов объекта.
например, в C# вы можете найти интерфейсы и классы. Оба они являются типами, но интерфейс может определить только некоторые contract и не может быть создан в отличие от классов.
проще говоря класс это специализированного типа используется для описания свойств и поведения объекта.
Википедия может дать вам более полный ответ:
чтобы проиллюстрировать это самым быстрым способом:
структура-это тип, но структура не является классом.
Как вы можете видеть, тип является "абстрактным" термином не только для определений классов, но и для структур и примитивных типов данных, таких как float, int, bool.
Type концептуально является надмножеством класса. В более широком смысле класс - это одна из форм типа.
тесно связаны с классами интерфейсы, которые можно рассматривать как особый вид класса - чисто абстрактный. Эти типы.
таким образом," тип " охватывает классы, интерфейсы и примитивы на большинстве языков. Также платформы, такие как dot-net CLR, также имеют типы структуры.
мои мысли в значительной степени соответствуют ответу Аку.
Я вижу классы как шаблон для построения объектов, а типы-это способ классификации этих объектов и предоставления нам интерфейса к ним.
Python также добавляет метаклассы, которые являются просто механизмом для создания классов, так же, как классы строят объекты (и хорошо, классы и метаклассы являются объектами).
этот ответ к тому же вопросу в Ламба последний кажется мне идеальным объяснением.
добавить еще один пример различия: в 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"
обратите внимание, что задействован только один класс, но можно использовать почти бесконечное количество типов. В некоторых языках функции считаются "первоклассными объектами", и в этом случае тип функции является классом. В других тип функции - это просто указатель. Классы обычно имеют понятия бытия возможность хранения данных, а также операций с этими данными.
взято из цитаты GoF снизу:
объекты по класс определяет, как объект реализован .Класс определяет внутреннее состояние объекта и осуществление его оперативный.
напротив, объекты тип только ссылается на ее интерфейс - набор запросов, к которым он может отвечать.
Я хочу привести пример использования 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
Я думаю о типе как о наборе вещей, которые вы можете сделать с определенным значением. Например, если у вас есть целочисленное значение, вы можете добавить его к другим целым числам (или выполнить другие арифметические операции) или передать его функциям, которые принимают целочисленный аргумент. Если у вас есть значение объекта, вы можете вызвать на нем методы, определенные его классом.
поскольку класс определяет, что вы можете делать с объектами этого класса, класс определяет тип. Класс-это больше, чем это, хотя, поскольку он также предоставляет описание того, как реализуются методы (что-то не подразумевается типом) и как выкладываются поля объекта.
Обратите также внимание, что значение объекта может иметь только один класс, но может иметь несколько типов, поскольку каждый суперкласс предоставляет подмножество функций, доступных в классе объекта.
таким образом, хотя объекты и типы тесно связаны, они на самом деле не одно и то же.
тип обычно относится к классификации примитивных значений-целых чисел, строк, массивов, логических значений, null и т. д. Обычно вы не можете создавать новые типы.
класс относится к именованному набору свойств и методов, с которыми связан объект при его создании. Обычно вы можете определить столько новых классов, сколько хотите, хотя на некоторых языках вам нужно создать новый объект, а затем присоединить к нему методы.
этот определение в основном верно, но некоторые языки пытались объединить типы и классы различными способами, с различными полезными результатами.
типы и классы связаны, но не идентичны. Я считаю, что классы используются для наследования реализации, тогда как типы используются для подстановки во время выполнения.
здесь ссылка объяснением принцип замещения и почему подклассы и подтипы не всегда одно и то же (в Java, например). The Википедия страница о ковариации и контравариации содержит больше информации об этом различии.
интересный вопрос. Я думаю, что ответ Аку точен. Возьмите 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
является (примитивным) типом, но не классом.
следовательно: каждый класс является типом, но не каждый тип является классом.
Если мы подумаем об этом вопросе в контексте C#, мы достигнем ответа ниже.
система типов C# делится на следующие категории:
значение типа:
- простые типы: как int, длиной, поплавок, etc.
- типы перечислимые
- типы структуры
- Nullable типы
ссылка типа:
- типы класс
- типы интерфейсов
- массив типы
- типы делегата
Как вы можете видеть, в C# есть много типов, класс которых является только одним из них. Есть только одно важное замечание: Система типов C#унифицирована таким образом, что значение любого типа может рассматриваться как объект. Каждый тип в C# прямо или косвенно происходит от типа класса object, а object является конечным базовым классом всех типов. Значения ссылочных типов обрабатываются как объекты, просто просматривая значения как объект типа. Ценности ценности типы обрабатываются как объекты путем выполнения операций бокса и распаковки.
Итак, как я вижу, type-это зонтик над многими элементами, класс которых является одним из них.
Referece: спецификация языка CSahrp doc, Страница 4