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

Что делает тип отличным от classа и наоборот?

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

Следующий ответ из книги Gof (Design Patterns)

Класс объекта определяет способ реализации объекта. Класс определяет внутреннее состояние объекта и реализацию его операций.

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

Объект может иметь много типов, а объекты разных classов могут иметь один и тот же тип.

//example in c++ template const T & max(T const & a,T const &b) { return a>b?a:b; //> operator of the type is used for comparision } 

max требуется тип с операцией> с его собственным типом, так как один из них интерфейс любой class, который удовлетворяет вышеуказанному требованию, может использоваться для генерации определенной функции max для этого classа.

Я всегда думаю о «типе» в качестве зонтичного термина для «classов» и «примитивов».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вы хотите, вы можете посмотреть на это следующим образом: Тип – это родительская концепция. Все остальные понятия: class, интерфейс, структура, целое и т. Д. Наследуют эту концепцию. Они являются типами

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

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

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

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

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

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

  • Определение classа
  • Определение типа данных

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

Struct – это тип, но Struct не является classом.

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

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

Тесно связанные с classами интерфейсы, которые можно рассматривать как особый вид classа – чисто абстрактный. Это тоже типы.

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

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

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

Python также добавляет метаclassы, которые являются всего лишь механизмом для создания classов, так же, как и classы, создающие объекты (а также classы и метаclassы – оба объекта).

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

Чтобы добавить еще один пример отличия: в C ++ у вас есть указатели и ссылочные типы, которые могут относиться к classам, но сами по себе не являются classами.

 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" 

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

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

Класс объектов определяет, как реализуется объект. Класс определяет внутреннее состояние объекта и реализацию его операций.

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

Я хочу привести пример с использованием Java:

 public interface IType { } public class A implements IType { public A{}; } public class B implements IType { public B{}; } 

Оба classа A и B реализуют интерфейс и, следовательно, относятся к типу IType . Кроме того, в Java оба classа производят собственный тип (соответственно их имя classа). Таким образом, class A имеет тип A и IType а class B имеет тип B и IType удовлетворяющий:

Объект может иметь много типов, а объекты разных classов могут иметь один и тот же тип.

Разница между подтипами и подclassом, вероятно, также помогает понять эту проблему:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Простые типы: например, int, long, float и т. Д.
  • Типы перечислений
  • Типы типов
  • Неверные типы

Типы ссылок:

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

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

как я вижу, тип – это зонтик над множеством предметов, class которых является одним из них.

Referece: CSahrp Language Specification doc, стр. 4

  • Как я могу вычислить декартово произведение итеративно?
  • Почему в C # не разрешены параметры const?
  • Наиболее эффективная реализация classа большого числа
  • Что такое хорошая функция hashа?
  • Когда правильно для конструктора выбрасывать исключение?
  • Interesting Posts

    Android Studio не удалось найти версию, совместимую с com.android.support:appcompat-v7:+

    Для Android SDK требуется Android Developer Toolkit версии 23.0.0 или выше

    Для чего нужны файлы Web.Debug.config и Web.Release.Config?

    Как остановить Windows 10 от автоматического перезапуска

    Объединение 2 SQL-запросов и получение результата в одном

    Записи чтения / записи в C ++

    Циркулярные ссылки Причина утечки памяти?

    Подключите мобильный телефон к Интернету с помощью настольного ПК

    getResources (). getColor () устарел

    android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных

    Экран моего ноутбука не включается после перезапуска, но после завершения работы

    Использование ограниченной переменной с длиной `/ 2`

    Предложения по шаблонам электронной почты Java?

    Как удалить символы подчеркивания в именах полей с помощью logstash?

    Вентиляторы и источники питания не выключаются в режиме ожидания

    Давайте будем гением компьютера.