Відповіді:
Визначення
Об'єкт є першокласним, коли він:
- може зберігатися у змінних та структурах даних
- може бути переданий як параметр підпрограмі
- може бути повернуто в результаті підпрограми
- може бути побудований під час виконання
- має внутрішню ідентичність (незалежно від будь-якого імені)
Термін "об'єкт" тут використовується вкрай, не обов'язково посилаючись на об'єкти в об'єктно-орієнтованому програмуванні. Найпростіші скалярні типи даних, такі як цілі числа та числа з плаваючою комою, майже завжди є першокласними.
Поняття «першокласний громадянин» або «елемент першого класу» мовою програмування було введено британським вченим-комп’ютером Крістофером Страчі в 60-х роках у контексті функцій першого класу. Найвідоміше формулювання цього принципу, ймовірно, у структурі та інтерпретації комп’ютерних програм Джеральда Джея Суссмана та Гаррі Абелсона:
- Вони можуть бути названі змінними.
- Вони можуть бути передані як аргументи до процедур.
- Вони можуть бути повернуті як результати процедур.
- Вони можуть бути включені до структур даних.
В основному це означає, що ви можете зробити з цим елементом мови програмування все, що ви можете зробити з усіма іншими елементами мови програмування.
Вся справа в "рівних правах": ви можете зробити все вищезазначене, скажімо, цілими числами, то чому б будь-яка інша річ відрізнялася?
Вищенаведене визначення є дещо обмежуючим, тому що воно дійсно говорить лише про аспект першокласниці, пов’язаний із об'єктами програми. Більш загальним визначенням буде те, що річ є першокласною, якщо ти вмієш робити все з нею, а також з іншими речами подібного роду.
Наприклад, оператори Java та методи Java мають подібний вид. Ви можете визначити нові методи, ви можете (дещо) вільно вибирати назви власних методів, ви можете переосмислити методи, ви можете перевантажувати методи. Джеймс Гослінг може все це зробити і з операторами, але ви і я не можете. Я маю в виду, всупереч поширеній думці, Java робить перевантаження оператора підтримки: наприклад, +
оператор перевантажений byte
, short
, int
, long
, float
, double
і String
, і IIRC в Java 7 також BigInteger
і BigDecimal
(і , можливо, пара я забув), це просто , що вамне мають на це ніякого впливу. Це явно робить операторів другим класом згідно з цим другим визначенням. Зауважте, що методи все ще не є першокласними об'єктами згідно першого визначення. (Це робить операторів третім класом?)
Зазвичай це стосується конструкції, яка є прохідною як параметр, може бути визначена як тип повернення від функції або може бути призначено значення. Зазвичай вам потрібно вміти їх конструювати під час виконання. Наприклад, екземпляр класу буде громадянином першого класу в c ++ або java, але функції в C не буде.
Я б сказав, що особливість є громадянином першого класу, якщо вона реалізована виключно мовою.
тобто для її використання не потрібні кілька мовних функцій або стандартна бібліотека.
Приклад:
В C / C ++ я не вважаю функції громадянами першого класу (можуть інші).
Це тому, що існують способи маніпулювання функціями, які підтримуються безпосередньо мовою, але вимагають використання інших мовних функцій. Прив’язування параметрів до функції не підтримується безпосередньо, і ви повинні створити функтор для реалізації цієї функції.
Щоб додати приклад до вже наданих відповідей:
У WCF / C # вам в даний час потрібно позначити об’єкт класу атрибутом договору про надання послуги, щоб він працював як послуга. Немає такого поняття, як:
public **service** MyService (in relation public **class** MyClass).
Клас - це громадянин першого класу в c #, де служби немає.
Сподіваюся, це допомагає