Вопрос

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

(В общем независимом от языка смысле)

Это было полезно?

Решение

Следующий ответ взят из книги Gof ( Шаблоны дизайна )

  

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

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

     

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

//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 требуется тип с operation > со своим собственным типом, поскольку один из его интерфейсов - любой класс, который удовлетворяет вышеуказанному требованию, может использоваться для генерации конкретной функции max для этого класса.

Другие советы

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

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

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

Вдохновлен Википедия...

В теория типов условия;

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

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

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

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

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

enter image description here

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

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

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

    А ABCBanana класс мог бы затем производить определенные бананы, которые случаи принадлежащий ABCBanana сорт, они были бы объекты из тип Банан.

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

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

Если вы хотите, вы можете посмотреть на это так: тип является родительским понятием. Все остальные понятия: класс, интерфейс, структура, целое число и т. Д. Унаследованы от этого понятия. Т.е. они являются типами

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

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

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

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

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

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

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

Структура - это тип, но структура - это не класс.

Как видите, тип - это " abstract " Термин не только для определения классов, но также для структур и примитивных типов данных, таких как float, int, bool.

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

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

Итак, " введите " включает в себя классы, интерфейсы и в большинстве языков примитивы тоже. Кроме того, платформы, такие как CLR dot-net, также имеют структурные типы.

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

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

Python также добавляет метаклассы, которые являются просто механизмом для создания классов, так же, как классы создают объекты (и, конечно же, классы и метаклассы являются объектами).

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

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

  

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

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

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

public interface IType {
}

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

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

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

  

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

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

https: //www.cs.princeton. образование / курсы / архив / fall98 / cs441 / mainus / node12.html

Чтобы добавить еще один пример различия: в 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"

Обратите внимание, что задействован только один класс, но можно использовать почти бесконечное количество типов. В некоторых языках функции считаются & Quot; first-class-objects & Quot; в этом случае тип функции является классом. В других тип функции является просто указателем. Как правило, классы имеют возможность хранить данные, а также операции с этими данными.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Класс состоит из таких частей:

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

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

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

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

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

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

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

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

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

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

  • Простые типы:например int, long, float и т. д.
  • Типы перечислений
  • Типы структур
  • Обнуляемые типы

Типы ссылок:

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

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

насколько я понимаю, тип — это зонтик для многих элементов, класс которых является одним из них.

Ссылка:Документ «Спецификация языка CSahrp», стр. 4

В общеязыковом смысле - класс является реализацией типа .

Часто, когда это реализация only этого типа, вы можете использовать оба термина для ссылки на него в некотором контексте.

Напротив, например, в контексте C # - Класс - это всего лишь один из еще много реализаций концепции Type , такой как примитивы, структуры, указатели и т. д.

Это был хороший вопрос для меня, который заставил меня задуматься. Я бы осмелился сказать, что Class - это штука во время компиляции, а Type - штука во время выполнения. Я говорю это потому, что вы пишете классы, а не типы. Затем компилятор создает типы из классов, а среда выполнения использует типы для создания экземпляров объектов.

Типы в C, такие как Int Float, char и т. д., определяют данные, к которым можно обращаться с помощью определенных методов, которые могут с ними работать. Это не сложнее, чем это. Как для int я могу добавить, вычесть умножить и, возможно, делить. Это мои методы (или операции) для int. Класс - это просто определение нового типа. Сначала я определяю, как выглядят данные. Может быть, это один бит. Может быть, это два слова, как комплекс с реальной и мнимой частью. Или, может быть, это сложная штука с 309734325 байтами, представляющими атомную структуру странной частицы на Юпитере. Мне все равно Как целое число, я выполняю операции, которые могу выполнять с этим новым типом данных. В случае целого числа, которое я добавил, вычел и т. Д. С помощью этого нового типа данных я могу определить любые операции, которые я считаю целесообразными. Они могут быть добавлены вычитать и т.д., но они могут добавить другие вещи Это те методы, которые я решу добавить в свой класс.

Суть в том, что с типом в C у вас есть определение того, что это за данные, т.е. байт, слово, число с плавающей запятой, символ и т. д. Но любой из них также подразумевает, какие операции являются законными и дают надежные результаты.

Класс ничем не отличается, за исключением того, что вы сами определяете интерфейс и допустимые операции. Класс определяет эти вещи, и когда вы создаете его экземпляр в Object, он определяет поведение объекта так же, как определение типа определяет поведение целого числа при работе с ним.

Классы просто дают вам гибкость в определении новых типов и всего, что касается их работы.

Как только это определено, каждый раз, когда я создаю экземпляр объекта класса " thingy " ;, он имеет определенную мной структуру данных и операции (методы), которые, как я сказал, вы можете делать с ним. Класс & Quot; thingy & Quot; Ясно, что это не что иное, как новый тип, который C ++ позволяет мне определять.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top