Відповіді:
Наступна відповідь з книги 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 вимагає типу з операцією> з її власним типом, як один з них інтерфейс, будь-який клас, який задовольняє вищевказаній вимозі, може використовуватися для створення конкретної максимальної функції для цього класу.
Я завжди думаю про "тип" як парасольовий термін для "класів" і "примітивів".
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Натхненний Вікіпедією ...
У термінах теорії типів ;
Тип є абстрактним інтерфейсом.
Типи зазвичай представляють іменники, такі як людина, місце чи річ, або щось номіналізоване,
Клас являє собою реалізацію типу.
Це конкретна структура даних та збір підпрограм
Різні конкретні класи можуть створювати об'єкти одного абстрактного типу (залежно від типу системи).
* Наприклад, можна реалізувати тип Stack
з двома класами : SmallStack
(швидко для невеликих стеків, але погано масштабується) та ScalableStack
(масштабує добре, але високі накладні витрати для невеликих стеків). *
Аналогічно, даний клас може мати кілька різних конструкторів .
Приклад банана.
Banana
Тип представлятиме властивості і функціональність бананів в цілому.
ABCBanana
ІXYZBanana
класи представлятимуть способи виробництва бананів.
(Різні постачальники бананів у реальному житті або різні структури даних та функції представлення та малювання бананів у відеоіграх).
ABCBanana
Клас може потім виробляти певні банани , які є екземплярами цьогоABCBanana
класу , вони були б об'єкти з типу банана .
Не рідко програміст надає єдину і єдину реалізацію для типу. У цьому випадку ім'я класу часто тотожне імені типу . Але все ж є тип (який може бути вилучений в інтерфейсі за потреби) та реалізація (яка реалізує окремий інтерфейс), яка будує екземпляри (об'єкти) класу.
Тип - це парасольовий термін для всіх доступних шаблонів або концепцій об'єктів. Клас - один такий шаблон об'єкта. Так само тип структури, тип Integer, тип інтерфейсу тощо. Це всі типи
Якщо ви хочете, ви можете подивитися на це так: Тип - це батьківська концепція. Всі інші поняття: Клас, Інтерфейс, Структура, Ціле число тощо успадковують від цього concept.ie Вони є типами
Тип містить опис даних (тобто властивостей, операцій тощо),
Клас - це специфічний тип - це шаблон для створення примірників об’єктів .
Строго кажучи, клас - це особливе поняття, його можна розглядати як пакет, що містить підмножину метаданих, що описують деякі аспекти об'єкта.
Наприклад, у C # ви можете знайти інтерфейси та класи. Вони обидва типи, але інтерфейс може визначати лише якийсь контракт і не може бути екземпляром на відміну від класів.
Просто кажучи, клас - це спеціалізований тип, який використовується для інкапсуляції властивостей та поведінки об'єкта.
Вікіпедія може дати вам більш повну відповідь:
Щоб проілюструвати це найшвидшим способом:
Структура - це тип, але структура - це не клас.
Як бачимо, Type - це "абстрактний" термін не тільки для визначень класів, але і для структур та примітивних типів даних, таких як float, int, bool.
Type
(з великої літери, як показано) - це коротка назва системного класу ( System.Type
), який використовується для зберігання описів типів.
Тип - це концептуальна надгрупа класу. У більш широкому розумінні клас - це одна з типів.
Тісно пов'язані з класами - це інтерфейси, які можна розглядати як особливий вид класу - суто абстрактний. Це теж типи.
Тож "тип" охоплює класи, інтерфейси і в більшості мов також примітиви. Також такі платформи, як CLT dot-net, також мають типи структури.
Щоб додати ще один приклад розрізнення: у 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"
Зауважте, що бере участь лише один клас, але можна використовувати майже нескінченну кількість типів. У деяких мовах функція вважається "об'єктами першого класу", в цьому випадку тип функції - це клас. В інших тип функції - це лише вказівник. Класи, як правило, мають поняття вміння зберігати дані, а також операції з цими даними.
Мої думки в значній мірі відповідають відповіді Аку.
Класи я бачу як шаблон для побудови об’єктів, тоді як типи - це спосіб класифікувати ці об'єкти та надавати нам інтерфейс до них.
Python також додає метакласи, які є лише механізмом побудови класів, так само, як класи будують об'єкти (і добре, що класи і метакласи - це обидва об'єкти).
Ця відповідь на те саме питання в ламбі остаточно здається мені ідеальним поясненням.
Взяте із цитування 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
Я думаю, що тип - це сукупність речей, які ви можете зробити з певним значенням. Наприклад, якщо у вас є ціле значення, ви можете додати його до інших цілих чисел (або виконати інші арифметичні операції) або передати його функціям, які приймають цілий аргумент. Якщо у вас є об'єктне значення, ви можете викликати на ньому методи, визначені його класом.
Оскільки клас визначає, що можна зробити з об'єктами цього класу, клас визначає тип. Клас є більш ніж цим, оскільки він також містить опис того, як реалізуються методи (щось не мається на увазі під типом) та як викладаються поля об’єкта.
Зауважте також, що значення об'єкта може мати лише один клас, але воно може мати кілька типів, оскільки кожен надклас забезпечує підмножину функціональних можливостей, доступних у класі об'єкта.
Тож хоча об’єкти та типи тісно пов'язані, вони насправді не одне й те саме.
Типи C, як-от Int Float, char тощо, визначають дані, щодо яких можна діяти за допомогою певних методів, які можуть працювати над ними. Це не складніше за це. Як для int, я можу додавати, віднімати множення і, можливо, ділити. Це мої методи (або операції) для int. Клас - це просто визначення нового типу. Я спочатку визначу, як виглядають дані. Можливо, це єдиний біт. Можливо, це два слова, як складне з реальною та уявною частиною. А може, це ця складна річ з 309734325 байтами, що представляють атомний склад дивної частинки на Юпітері. Мені все одно. Як і ціле число, я можу скласти операції, які я можу зробити з цим новим типом даних. У випадку цілого числа я повинен був додавати, віднімати і т. Д. За допомогою цього нового типу даних я можу визначити всі операції, які, на мою думку, мають сенс. Вони можуть бути додані віднімання тощо. але вони можуть додавати інші речі. Це будь-які методи, які я вирішу додати до свого класу.
Суть полягає в тому, що для типу C ви маєте визначення того, що це дані, тобто; байт, слово, float, char тощо. Але будь-яке з них також означає, що операції є законними і дадуть надійні результати.
Клас не відрізняється, окрім того, як визначити інтерфейс та прийнятні операції, залежати від вас. Клас визначає ці речі, і коли ви інстанціюєте його в Object, він визначає поведінку об'єкта так само, як визначення типу визначає поведінку цілого числа, коли ви працюєте над ним.
Заняття просто дають вам можливість визначати нові типи та все, як вони діють.
Після того, як це буде визначено, кожен раз, коли я створюю об'єкт класу "thingy", він має структуру даних, яку я визначив, і операції (методи), за якими я сказав, що ви можете з цим робити. Клас "thingy" явно не є більш-менш новим типом, який C ++ дозволяє мені визначати.
Тип зазвичай відноситься до класифікації примітивних значень - цілих чисел, рядків, масивів, булевих значень, null тощо. Зазвичай ви не можете створити жодних нових типів.
Клас відноситься до названого набору властивостей і методів, з якими об'єкт пов'язаний при його створенні. Зазвичай ви можете визначити стільки нових класів, скільки хочете, хоча для деяких мов вам потрібно створити новий об'єкт, а потім приєднати до нього методи.
Це визначення здебільшого вірно, але деякі мови намагалися поєднувати типи та класи різними способами з різними корисними результатами.
Типи та класи пов'язані, але не тотожні. Я вважаю, що класи використовуються для успадкування реалізації, тоді як типи використовуються для заміни часу виконання.
Ось посилання, що пояснює принцип заміщення і чому підкласи та підтипи - це не завжди одне і те ж (наприклад, на Java). Сторінка вікіпедії про коваріацію та протиріччя має більше інформації про це відмінність.
У загальному мовою агностиком сенсі - клас є реалізація в Type .
Часто, коли це єдина реалізація цього типу, ви можете використовувати обидва терміни для посилання на нього в якомусь контексті.
Навпаки, наприклад, в контексті C # - клас тільки один з багатьох інших реалізацій одного типу поняття , як примітиви, структури, покажчики і т.д.
Цікаве запитання. Я думаю, що у відповіді Аку це місце. Візьмемо ArrayList
для прикладу клас java
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
Кажуть, що екземпляр класу має тип кожного надкласу, який він розширює, і кожного інтерфейсу, який він реалізує. Таким чином, екземпляр ArrayList
класу має тип ArrayList
, RandomAccess
, Cloneable
і так далі. Іншими словами, значення (або екземпляри) належать до одного або декількох типів, класи визначають, що це за типи.
Різні класи можуть описувати один і той же тип.
Тип складається з таких частин:
Клас складається з таких частин:
Деякі примітки:
Інтерфейс (як у Java) не є типом, оскільки не описує семантику (описує лише синтаксис)
Підклас не є підтипом, оскільки підклас може змінювати семантику, визначену в надкласі, підтип не може змінювати семантику супертипу (див. Принцип заміщення Ліскова, наприклад, цей приклад LSP ).
Якщо ми думаємо на це питання в контексті C #, ми знаходимо наступну відповідь.
Система типу C # поділяється на такі категорії:
Типи значення:
Довідкові типи:
Як бачимо, у C # існує багато типів, клас яких є лише одним із них. Є лише одна важлива примітка: система типів C # уніфікована таким чином, що значення будь-якого типу можна розглядати як об'єкт. Кожен тип C # прямо чи опосередковано походить від типу класу об'єктів, а об'єкт - кінцевий базовий клас усіх типів. Значення типів посилань трактуються як об'єкти, просто переглядаючи значення як об'єкт типу. Значення типів значень трактуються як об'єкти, виконуючи операції боксу та розпакування.
так що, як я бачу, type - це парасолька для багатьох предметів, клас яких є одним із них.
Референція: специфікація мови CSahrp, документ, сторінка 4
Це було гарне запитання для мене, яке змусило задуматися. Я б наважився сказати, що клас - це компіляція, а тип - це час виконання. Я говорю це тому, що ви пишете заняття не типи. Потім компілятор створює типи з класів, а типи виконання використовуються для створення примірників об'єктів.