Верхній тип
Верхній тип у теорії типів математики, логіки й інформатики, — універсальний тип, який іноді називають універсальним супертипом, оскільки усі інші типи будь-якої системи типів є підтипами[en] кореня. Здебільшого це тип, що містить усі можливі об'єкти досліджуваної системи типів. Визначення верхнього типу є протилежністю визначенню найнижчого типу[en], або універсального підтипу, для якого кожен інший тип є супертипом і в більшості випадків це тип, який взагалі не містить об'єктів.
Підтримка у мовах програмування
ред.Декілька типізованих мов програмування забезпечують явну підтримку верхнього типу.
У статично типізованих мовах обговорюються два різних поняття, що часто плутаються:
- Універсальний базовий клас або інший елемент у верхній частині ієрархії класів часу виконання (часто має відношення саме до об'єктно-орієнтованого програмування) або ієрархії типів; часто дозволено створювати об'єкти цього типу, або його можна знайти за допомогою рефлексії при виконанні програми
- Статичний тип часу компіляції[en], змінним якого можуть бути призначено будь-яке значення (або з його підмножини, наприклад, значення посилання на об'єкт), що є подібним до динамічного виведення типів
Перша концепція часто має на увазі другу: якщо існує універсальний базовий клас, то змінна, яка вказує на об'єкт цього класу, може насправді вказувати на об'єкт будь-якого класу. Тим не менш, кілька мов мають верхні типи у другому варіанті (наприклад, void *
в C ++, id
в Objective-C, interface {}
в Go), тобто якісь статичні типи, змінні яких можуть приймати будь-яке значення, але при виконанні програми не корелюють з реальними типами, які об'єкт може мати в даній системі типів, тому такі типи не є верхніми у логіці першого визначення.
У динамічно типізованих мовах друга концепція не існує (так як будь-яке значення може бути призначено будь-якій змінній), тому обговорюється лише перша (ієрархія класів). Ця стаття в основному обговорює першу концепцію верхніх типів, але буде згадувати другу в мовах, де вона є важливою.
Ім'я | Мови |
---|---|
Object
|
Smalltalk, JavaScript, Ruby (pre-1.9.2),[1] і деякі інші. |
java.lang.Object
|
Java. Часто пишеться без префікса пакета, просто Object . Крім того, цей клас не є супертипом примітивних типів; однак, з версії Java 1.5, автоматичне обгортання[en] дозволяє неявні або явні перетворення значень примітивних типів у Object , наприклад, ((Object)42).toString()
|
System.Object [2]
|
C #, Visual Basic .NET та інші мови .NET Framework |
object
|
Python після об'єднання типу і класу[3] у версії 2.2 (справедливо тільки для об'єктів нового стилю; об'єкти старого стилю в 2.x не успадковуються від object )
|
TObject
|
Object Pascal |
t
|
Lisp, багато з діалектів, в тому числі Common Lisp |
Any
|
Kotlin |
Any
|
Scala[4] |
ANY
|
Eiffel[5] |
UNIVERSAL
|
Perl 5 |
Variant
|
Visual Basic до версії 6 |
interface{}
|
Go |
BasicObject
|
Ruby (версія 1.9.2 і вище) |
Наступні об'єктно-орієнтовані мови не мають універсального базового класу:
- C++. Вказівник на тип void може приймати будь-який покажчик, що не є функцією, навіть якщо сам тип void не є універсальним типом, а типом-одиницею[en].
- Objective-C. Дозволено створення нового базового класу, для цього потрібно не вказати батьківський клас іншому класу, що є достатньо незвичним випадком.
Object
традиційно використовується в якості базового класу під час виконання оригінального Objective-C. У бібліотеках OpenStep і CocoaNSObject
є універсальним базовим класом. Верхнім типом для посилань на об'єкти єid
. - Swift. Так же як і у Objective-C, можливо створити новий базовий клас, якщо не вказати батьківський клас для класу. Протокол
Any
може приймати будь-який тип. - PHP.
Інші мови
ред.Мови, які не є об'єктно-орієнтованими, зазвичай не мають підтримки універсального супертипу, або, іншими словами, поліморфізму на основі підтипів.
Хоча Haskell цілеспрямовано не має підтипів, він має кілька інших форм поліморфізму, включаючи параметричний поліморфізм[en]. Найбільш поширеним параметром узагальненого класу типів є forall a. a
. Аналогічно в Rust, <T: ? Sized>
є найзагальнішим параметром (<T>
таким не є, оскільки він має на увазі Sized
).
Верхній тип використовується як узагальнений тип, особливо в мовах без параметричного поліморфізму[en]. Наприклад, перед включенням у Java 5 дженериків, класи колекцій в бібліотеці Java (за винятком масивів Java) працювали з посиланнями типу Object
. Таким чином, об'єкт будь-якого типу може бути вставлений в колекцію. Верхній тип також часто використовується для зберігання об'єктів невідомого типу.
У мовах зі структурною системою типів[en] верхній тип — це порожня структура. Наприклад, об'єкти в OCaml структурно типізовані; порожній об'єктний тип (тип об'єктів з відсутніми методами), < >
— верхній тип типів об'єктів. Будь-який об'єкт OCaml може бути явно перетворений на цей тип, хоча результат не буде корисним. Go також використовує структурну типізацію; також усі типи реалізують порожній інтерфейс: interface {}
.
Верхній тип може розглядатися як непрямий тип не статистично типізованих мов. Мови з типізацією під часу виконання часто надають операцію уточнення типу[en] для того, щоб дозволити привести об'єкт до більш конкретного типу під час виконання. У C ++ уточнення з void *
не може бути здійснено безпечним способом, де під безпечним способом мається на увазі виявлення мовою програмування помилки уточнення типу під час виконання програми.
У логіці
ред.Поняття вершини також зустрічається в численні висловлювань, і відповідає формулі, яка істинна в будь-якому можливому тлумаченні. Вона має аналогічне значення в численні предикатів. В описовій логіці вершина використовується для позначення набору усіх понять. Це інтуїтивно схоже на використання верхнього типу у мовах програмування. Наприклад, у Web Ontology Language (OWL), яка підтримує різні описувальні логіки, вершина відповідає класу owl:Thing
, де всі класи є підкласами owl:Thing
(нижній тип або порожня множина відповідає owl:Nothing
).
Див. також
ред.Примітки
ред.- ↑ Class: BasicObject (Ruby 1.9.2). Процитовано 7 квітня 2014.
- ↑ System.Object
- ↑ Об'єднання типу / класу Python
- ↑ An Overview of the Scala Programming Language (PDF). 2006. Процитовано 7 квітня 2014.
- ↑ Standard ECMA-367. Eiffel: Analysis, Design and Programming Language (PDF). 2006. Процитовано 10 березня 2016.