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

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

(В общем языке-агностический смысл)

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 (Весы хорошо, но высокие накладные расходы для малых стеков).*

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

enter image description here

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

  • 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 и так далее. Другими словами, значения (или экземпляры) принадлежат одному или нескольким типам, классы определяют, что это за типы.


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

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

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

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

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

некоторые замечания:

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

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


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

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

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


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

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

значение типа:

  • простые типы: как int, длиной, поплавок, etc.
  • типы перечислимые
  • типы структуры
  • Nullable типы

ссылка типа:

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

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

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

Referece: спецификация языка CSahrp doc, Страница 4