Чим відрізняється тип і клас?


Відповіді:


121

Наступна відповідь з книги 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 вимагає типу з операцією> з її власним типом, як один з них інтерфейс, будь-який клас, який задовольняє вищевказаній вимозі, може використовуватися для створення конкретної максимальної функції для цього класу.


56

Я завжди думаю про "тип" як парасольовий термін для "класів" і "примітивів".

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

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


7
приємне і лаконічне пояснення :)
Аку

3
Ну, в .NET це повинно бути те саме, навіть примітиви є класами (або точніше структурами).
Далле

4
@dalle: погоджено, немає різниці між типом і класом. Приклад Едді дуже залежить від C ++ / Java. Це зовсім не визначення.
Роберт Гулд

Я думаю, що буде важко отримати "THE" визначення "типу" проти класу. Так багато мов мають власну систему набору тексту. Одне визначення, яке я чув для .NET, - це те, що "тип" включає в себе і типи ref, і value, тоді як клас використовується лише для опису типів ref.
Едді Паркер

2
Це не просто короткий хід для системи System.Int32? Іншими словами: int foo; // Тип - int, клас - System.Int32?
Свиш

51

Натхненний Вікіпедією ...

У термінах теорії типів ;

  • Тип є абстрактним інтерфейсом.
    Типи зазвичай представляють іменники, такі як людина, місце чи річ, або щось номіналізоване,

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

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

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

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

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

Приклад банана.

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

  • ABCBananaІ XYZBanana класи представлятимуть способи виробництва бананів.
    (Різні постачальники бананів у реальному житті або різні структури даних та функції представлення та малювання бананів у відеоіграх).

    ABCBananaКлас може потім виробляти певні банани , які є екземплярами цього ABCBanana класу , вони були б об'єкти з типу банана .

Не рідко програміст надає єдину і єдину реалізацію для типу. У цьому випадку ім'я класу часто тотожне імені типу . Але все ж є тип (який може бути вилучений в інтерфейсі за потреби) та реалізація (яка реалізує окремий інтерфейс), яка будує екземпляри (об'єкти) класу.


3
Як хтось, хто намагається вчитися, якщо не навести приклад із реального світу, це справді мені дуже допомогло. Дякую.
alexc95

13

Тип - це парасольовий термін для всіх доступних шаблонів або концепцій об'єктів. Клас - один такий шаблон об'єкта. Так само тип структури, тип Integer, тип інтерфейсу тощо. Це всі типи

Якщо ви хочете, ви можете подивитися на це так: Тип - це батьківська концепція. Всі інші поняття: Клас, Інтерфейс, Структура, Ціле число тощо успадковують від цього concept.ie Вони є типами


4

Тип містить опис даних (тобто властивостей, операцій тощо),

Клас - це специфічний тип - це шаблон для створення примірників об’єктів .

Строго кажучи, клас - це особливе поняття, його можна розглядати як пакет, що містить підмножину метаданих, що описують деякі аспекти об'єкта.

Наприклад, у C # ви можете знайти інтерфейси та класи. Вони обидва типи, але інтерфейс може визначати лише якийсь контракт і не може бути екземпляром на відміну від класів.

Просто кажучи, клас - це спеціалізований тип, який використовується для інкапсуляції властивостей та поведінки об'єкта.

Вікіпедія може дати вам більш повну відповідь:


4

Щоб проілюструвати це найшвидшим способом:

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

Як бачимо, Type - це "абстрактний" термін не тільки для визначень класів, але і для структур та примітивних типів даних, таких як float, int, bool.


2
Добре було б згадати .net CLR як приклад рамки, в якій існують типи, які не є класами (Java може бути вказана як інший, хоча .net має більше типів). Додаткова невелика зморшка в .net, однак, полягає в тому, що Type(з великої літери, як показано) - це коротка назва системного класу ( System.Type), який використовується для зберігання описів типів.
supercat

3

Тип - це концептуальна надгрупа класу. У більш широкому розумінні клас - це одна з типів.

Тісно пов'язані з класами - це інтерфейси, які можна розглядати як особливий вид класу - суто абстрактний. Це теж типи.

Тож "тип" охоплює класи, інтерфейси і в більшості мов також примітиви. Також такі платформи, як CLT dot-net, також мають типи структури.


rajKumar, ваше запитання досить неоднозначне. ви як про "тип" як особливість якоїсь мови, або як загальне поняття?
аку

Не всі визначені користувачем типи - це класи, принаймні, не на всіх мовах.
jalf

jalf, погодьтеся, це неправильні характеристики. інтерфейс також визначений користувачем, і не може бути визначених користувачем типів. Клас - це спеціалізований тип, який обслуговує особливі потреби (створення екземплярів предметів)
аку

Інтерфейс - це просто особливий тип, чисто абстрактний клас - це все-таки тип (у більшому сенсі).
Лоуренс Дол

Програмне забезпечення Monkey, інтерфейс - не суто абстрактний клас - це особлива концепція. "визначено користувачем" не є визначальною властивістю класів
аку

3

Щоб додати ще один приклад розрізнення: у 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"

Зауважте, що бере участь лише один клас, але можна використовувати майже нескінченну кількість типів. У деяких мовах функція вважається "об'єктами першого класу", в цьому випадку тип функції - це клас. В інших тип функції - це лише вказівник. Класи, як правило, мають поняття вміння зберігати дані, а також операції з цими даними.


3

Мої думки в значній мірі відповідають відповіді Аку.

Класи я бачу як шаблон для побудови об’єктів, тоді як типи - це спосіб класифікувати ці об'єкти та надавати нам інтерфейс до них.

Python також додає метакласи, які є лише механізмом побудови класів, так само, як класи будують об'єкти (і добре, що класи і метакласи - це обидва об'єкти).

Ця відповідь на те саме питання в ламбі остаточно здається мені ідеальним поясненням.


3

Взяте із цитування GoF знизу:

Клас об'єктів визначає, як об’єкт реалізується. Клас визначає внутрішній стан об'єкта та реалізацію його операцій.

На відміну від цього , Objects ігрового типу відноситься тільки до його інтерфейсу -The набору запитів , на які він може реагувати.

Я хочу навести приклад за допомогою 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


2

Я думаю, що тип - це сукупність речей, які ви можете зробити з певним значенням. Наприклад, якщо у вас є ціле значення, ви можете додати його до інших цілих чисел (або виконати інші арифметичні операції) або передати його функціям, які приймають цілий аргумент. Якщо у вас є об'єктне значення, ви можете викликати на ньому методи, визначені його класом.

Оскільки клас визначає, що можна зробити з об'єктами цього класу, клас визначає тип. Клас є більш ніж цим, оскільки він також містить опис того, як реалізуються методи (щось не мається на увазі під типом) та як викладаються поля об’єкта.

Зауважте також, що значення об'єкта може мати лише один клас, але воно може мати кілька типів, оскільки кожен надклас забезпечує підмножину функціональних можливостей, доступних у класі об'єкта.

Тож хоча об’єкти та типи тісно пов'язані, вони насправді не одне й те саме.


2

Типи C, як-от Int Float, char тощо, визначають дані, щодо яких можна діяти за допомогою певних методів, які можуть працювати над ними. Це не складніше за це. Як для int, я можу додавати, віднімати множення і, можливо, ділити. Це мої методи (або операції) для int. Клас - це просто визначення нового типу. Я спочатку визначу, як виглядають дані. Можливо, це єдиний біт. Можливо, це два слова, як складне з реальною та уявною частиною. А може, це ця складна річ з 309734325 байтами, що представляють атомний склад дивної частинки на Юпітері. Мені все одно. Як і ціле число, я можу скласти операції, які я можу зробити з цим новим типом даних. У випадку цілого числа я повинен був додавати, віднімати і т. Д. За допомогою цього нового типу даних я можу визначити всі операції, які, на мою думку, мають сенс. Вони можуть бути додані віднімання тощо. але вони можуть додавати інші речі. Це будь-які методи, які я вирішу додати до свого класу.

Суть полягає в тому, що для типу C ви маєте визначення того, що це дані, тобто; байт, слово, float, char тощо. Але будь-яке з них також означає, що операції є законними і дадуть надійні результати.

Клас не відрізняється, окрім того, як визначити інтерфейс та прийнятні операції, залежати від вас. Клас визначає ці речі, і коли ви інстанціюєте його в Object, він визначає поведінку об'єкта так само, як визначення типу визначає поведінку цілого числа, коли ви працюєте над ним.

Заняття просто дають вам можливість визначати нові типи та все, як вони діють.

Після того, як це буде визначено, кожен раз, коли я створюю об'єкт класу "thingy", він має структуру даних, яку я визначив, і операції (методи), за якими я сказав, що ви можете з цим робити. Клас "thingy" явно не є більш-менш новим типом, який C ++ дозволяє мені визначати.


1

Тип зазвичай відноситься до класифікації примітивних значень - цілих чисел, рядків, масивів, булевих значень, null тощо. Зазвичай ви не можете створити жодних нових типів.

Клас відноситься до названого набору властивостей і методів, з якими об'єкт пов'язаний при його створенні. Зазвичай ви можете визначити стільки нових класів, скільки хочете, хоча для деяких мов вам потрібно створити новий об'єкт, а потім приєднати до нього методи.

Це визначення здебільшого вірно, але деякі мови намагалися поєднувати типи та класи різними способами з різними корисними результатами.


1
Навіть збіднілий з мовою тип C можна створювати нові типи, але він не має нічого подібного до того, що люди зазвичай вважають класами, за винятком структур, записів та класів, схожих один на одного.
Джеймс Ірі

1

Типи та класи пов'язані, але не тотожні. Я вважаю, що класи використовуються для успадкування реалізації, тоді як типи використовуються для заміни часу виконання.

Ось посилання, що пояснює принцип заміщення і чому підкласи та підтипи - це не завжди одне і те ж (наприклад, на Java). Сторінка вікіпедії про коваріацію та протиріччя має більше інформації про це відмінність.


1

У загальному мовою агностиком сенсі - клас є реалізація в Type .

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

Навпаки, наприклад, в контексті C # - клас тільки один з багатьох інших реалізацій одного типу поняття , як примітиви, структури, покажчики і т.д.


0

Цікаве запитання. Я думаю, що у відповіді Аку це місце. Візьмемо ArrayListдля прикладу клас java

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

ArrayListКажуть, що екземпляр класу має тип кожного надкласу, який він розширює, і кожного інтерфейсу, який він реалізує. Таким чином, екземпляр ArrayListкласу має тип ArrayList, RandomAccess, Cloneableі так далі. Іншими словами, значення (або екземпляри) належать до одного або декількох типів, класи визначають, що це за типи.


0

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

Тип складається з таких частин:

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

Клас складається з таких частин:

  1. Операції = синтаксис
  2. Впровадження (= різні реалізації описують ту саму семантику)

Деякі примітки:

  • Інтерфейс (як у Java) не є типом, оскільки не описує семантику (описує лише синтаксис)

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


0

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

Навіть у таких мовах, як Java, intце (примітивний) тип, але не клас.

Отже: кожен клас - це тип, але не кожен тип - це клас.


0

Якщо ми думаємо на це питання в контексті C #, ми знаходимо наступну відповідь.

Система типу C # поділяється на такі категорії:

Типи значення:

  • Прості типи: як int, long, float тощо.
  • Типи Enum
  • Типи структур
  • Зменшувані типи

Довідкові типи:

  • Типи класів
  • Типи інтерфейсів
  • Типи масивів
  • Делегуйте типи

Як бачимо, у C # існує багато типів, клас яких є лише одним із них. Є лише одна важлива примітка: система типів C # уніфікована таким чином, що значення будь-якого типу можна розглядати як об'єкт. Кожен тип C # прямо чи опосередковано походить від типу класу об'єктів, а об'єкт - кінцевий базовий клас усіх типів. Значення типів посилань трактуються як об'єкти, просто переглядаючи значення як об'єкт типу. Значення типів значень трактуються як об'єкти, виконуючи операції боксу та розпакування.

так що, як я бачу, type - це парасолька для багатьох предметів, клас яких є одним із них.

Референція: специфікація мови CSahrp, документ, сторінка 4


-1

Це було гарне запитання для мене, яке змусило задуматися. Я б наважився сказати, що клас - це компіляція, а тип - це час виконання. Я говорю це тому, що ви пишете заняття не типи. Потім компілятор створює типи з класів, а типи виконання використовуються для створення примірників об'єктів.


1
Ласкаво просимо до SO. Ця відповідь дуже схожа на щонайменше одного іншого, і користувачі ТА віддають перевагу більш технічній мові, ніж «штучній»!
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.