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



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



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

1683   17  

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тип будет представлять свойства и функциональность бананов в целом.

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

    The ABCBanana класс может затем производить определенные бананы, которые являются экземпляров на ABCBananaкласс они будут объекты на тип банан.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итак, "тип" охватывает классы, интерфейсы и в большинстве языков примитивы тоже. Также платформы, такие как 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, например). Элемент Википедия страница о ковариации и контравариации содержит дополнительную информацию об этом различии.

интересный вопрос. Я думаю, что ответ Аку на месте. Возьмите 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# делится на следующие категории:

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

  • простые типы: как инт, длиной, поплавок, ЕТК.
  • типы перечислимые
  • типы структуры
  • типы с нулевым значением

ссылка типа:

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

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

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

Referece: csahrp Language Specification doc, page 4

Comments

    Ничего не найдено.