Верхній тип

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

Підтримка у мовах програмування

Декілька типізованих мов програмування забезпечують явну підтримку верхнього типу.

У статично типізованих мовах обговорюються два різних поняття, що часто плутаються:

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

Перша концепція часто має на увазі другу: якщо існує універсальний базовий клас, то змінна, яка вказує на об'єкт цього класу, може насправді вказувати на об'єкт будь-якого класу. Тим не менш, кілька мов мають верхні типи у другому варіанті (наприклад, void * в C ++, id в Objective-C, interface {} в Go), тобто якісь статичні типи, змінні яких можуть приймати будь-яке значення, але при виконанні програми не корелюють з реальними типами, які об'єкт може мати в даній системі типів, тому такі типи не є верхніми у логіці першого визначення.

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

Наступні об'єктно-орієнтовані мови програмування містять такі універсальні базові класи:
Ім'я Мови
Object Smalltalk, JavaScript, Ruby (pre-1.9.2),[1] і деякі інші.
java.lang.Object Java. Часто пишеться без префікса пакета, просто Object. Крім того, цей клас не є супертипом примітивних типів; однак, з версії Java 1.5, автоматичне обгортання дозволяє неявні або явні перетворення значень примітивних типів у 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 не є універсальним типом, а типом-одиницею.
  • Objective-C. Дозволено створення нового базового класу, для цього потрібно не вказати батьківський клас іншому класу, що є достатньо незвичним випадком. Object традиційно використовується в якості базового класу під час виконання оригінального Objective-C. У бібліотеках OpenStep і Cocoa NSObject є універсальним базовим класом. Верхнім типом для посилань на об'єкти є id.
  • Swift. Так же як і у Objective-C, можливо створити новий базовий клас, якщо не вказати батьківський клас для класу. Протокол Any може приймати будь-який тип.
  • PHP.

Інші мови

Мови, які не є об'єктно-орієнтованими, зазвичай не мають підтримки універсального супертипу, або, іншими словами, поліморфізму на основі підтипів.

Хоча Haskell цілеспрямовано не має підтипів, він має кілька інших форм поліморфізму, включаючи параметричний поліморфізм. Найбільш поширеним параметром узагальненого класу типів є forall a. a. Аналогічно в Rust, <T: ? Sized> є найзагальнішим параметром (<T> таким не є, оскільки він має на увазі Sized).

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

У мовах зі структурною системою типів верхній тип — це порожня структура. Наприклад, об'єкти в OCaml структурно типізовані; порожній об'єктний тип (тип об'єктів з відсутніми методами), < > — верхній тип типів об'єктів. Будь-який об'єкт OCaml може бути явно перетворений на цей тип, хоча результат не буде корисним. Go також використовує структурну типізацію; також усі типи реалізують порожній інтерфейс: interface {}.

Верхній тип може розглядатися як непрямий тип не статистично типізованих мов. Мови з типізацією під часу виконання часто надають операцію уточнення типу для того, щоб дозволити привести об'єкт до більш конкретного типу під час виконання. У C ++ уточнення з void * не може бути здійснено безпечним способом, де під безпечним способом мається на увазі виявлення мовою програмування помилки уточнення типу під час виконання програми.

У логіці

Поняття вершини також зустрічається в численні висловлювань, і відповідає формулі, яка істинна в будь-якому можливому тлумаченні. Вона має аналогічне значення в численні предикатів. В описовій логіці вершина використовується для позначення набору усіх понять. Це інтуїтивно схоже на використання верхнього типу у мовах програмування. Наприклад, у Web Ontology Language (OWL), яка підтримує різні описувальні логіки, вершина відповідає класу owl:Thing, де всі класи є підкласами owl:Thing (нижній тип або порожня множина відповідає owl:Nothing).

Див. також

  • Ієрархія єдиного кореня

Примітки

  1. Class: BasicObject (Ruby 1.9.2). Процитовано 7 квітня 2014.
  2. System.Object
  3. Об'єднання типу / класу Python
  4. An Overview of the Scala Programming Language. 2006. Процитовано 7 квітня 2014.
  5. Standard ECMA-367. Eiffel: Analysis, Design and Programming Language. 2006. Процитовано 10 березня 2016.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.