Что такое первоклассные объекты в Java и C#?
Когда я начал программировать ОО много лет назад, у меня сложилось впечатление, что переменные (если это правильное слово) были либо "примитивами" (int, double и т. Д.), Либо первоклассными объектами (String, JPane и т. Д.). Это подтверждается недавним ответом на примитивы в Java и C# (@Daniel Pryden: отличаются ли примитивные типы в Java и C#?). Однако не знаю, являются ли C# ValueTypes примитивами, объектами или другими зверями, такими как объекты второго класса. Я вижу, что SO имеет только одно использование first-class
тег, так что, возможно, это больше не является полезным термином.
Я не нашел статью в Википедии полезной ("Эта статья нуждается во внимании эксперта по этому вопросу"). Я был бы благодарен за таксономию и текущее использование терминов, в первую очередь связанных с Java и C# (хотя, возможно, другие языки потеряют просветление).
Пояснение: я хотел бы понять термин " первоклассный" и каков его диапазон использования.
8 ответов
Проблема в том, что "объект первого класса" не является четко определенной концепцией.
Обычное использование состоит в том, что кто-то говорит, что "объект" - это класс вещей, который должен иметь все свойства X, Y и Z. Но есть другие вещи, которые не имеют всех этих свойств, но они являются своего рода объектно-МОГ. Поэтому мы будем называть бывшие объекты "первого класса", а остальные не "первоклассными"... и, возможно, не объектами.
Проблема в том, что существует какое-то количество представлений о свойствах, необходимых для того, чтобы вещь стала объектом первого класса. И нет никаких перспектив для людей с противоположными взглядами прийти к консенсусу. (Например, эксперт по языку Javascript может настойчиво утверждать, что объект является только первым классом, если он основан на шаблонах.)
Единственное действительно твердое понимание "первоклассности" - это то, что вы можете почерпнуть из соответствующих языковых спецификаций для Java и C#. И они действительно применяются только в рамках соответствующих языков / систем типов... а не для нескольких языков.
Таким образом, "первоклассный Java-объект" или "первоклассный C# -объект" может быть значимым, но "первоклассный объект" вне контекста не имеет значения.
Ну, это мое мнение...
Понятие "первоклассный гражданин" или "первоклассный элемент" в языке программирования было введено британским ученым-программистом Кристофером Стрейчи в 1960-х годах в контексте первоклассных функций. Наиболее известная формулировка этого принципа, вероятно, содержится в " Структуре и интерпретации компьютерных программ " Джеральда Джея Суссмана и Гарри Абельсона:
- Они могут быть названы переменными.
- Они могут быть переданы в качестве аргументов процедур.
- Они могут быть возвращены как результаты процедур.
- Они могут быть включены в структуры данных.
По сути, это означает, что вы можете делать с этим элементом языка программирования все, что вы можете делать со всеми другими элементами в языке программирования.
В.NET у вас нет примитивных типов против классов. Вместо этого у вас есть структуры против классов, но структуры имеют много общих характеристик классов (например, возможность иметь свойства и методы) и наследовать от Object
класс также.
Когда ты пишешь int
в C#, например, это просто ярлык языка для Int32
структура. Вы можете сделать, например, int i=int.Parse("34")
, или даже string s=1234.ToString()
, Для того, чтобы назначить экземпляры структуры переменным типа Object
, есть механизм бокса / распаковки.
В Java, с другой стороны, у вас действительно есть примитивные типы по сравнению с двудольным классом. Так, например, для выполнения операций с переменной типа int
, вы должны использовать вспомогательные Integer
учебный класс. Это одна из вещей, которые мне не нравятся в Java по сравнению с.NET.
РЕДАКТИРОВАТЬ. Когда вы читаете о "первоклассных объектах" (или классах), это означает "полностью работающие объекты", то есть классы, которые имеют те же возможности, что и любые другие системные классы или пользовательские классы. Это следует отличать от "ограниченных примитивных типов".
Для каждого примитивного типа данных в Java библиотека базовых классов предоставляет класс-оболочку, который представляет его как объект Java. Например, класс Int32 охватывает тип данных int, а класс Double - двойной тип данных.
С другой стороны, все примитивные типы данных в C# являются объектами в пространстве имен System. Для каждого типа данных предоставляется короткое имя или псевдоним. Например, int - это короткое имя System.Int32, а double - короткая форма System.Double.
Список типов данных C# и их псевдонимов представлен в следующей таблице. Как видите, первые восемь из них соответствуют примитивным типам, доступным в Java. Обратите внимание, однако, что логическое значение Java называется bool в C#.
От: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx
Честно говоря, я понятия не имею, что такое "первоклассный объект"...
Но я впервые обнаружил использование подобной идиомы в документации и списке рассылки Lua, говоря, что функции - это граждане первого класса, или ценности первого класса.
Я позволил одному из авторов Lua объяснить, что это такое: Программирование на Lua: 6 - Подробнее о функциях
Это означает, что в Lua функция является значением с теми же правами, что и обычные значения, такие как числа и строки. Функции могут храниться в переменных (как глобальных, так и локальных) и в таблицах, передаваться в качестве аргументов и могут быть возвращены другими функциями.
Так или иначе, это определение применимо к объектам в Java: вы можете хранить их в переменных, в массивах, использовать их в качестве параметров функции и возвращать их, использовать их в качестве ключа HashMap и других коллекций и т. Д.
Не уверен, что этот термин используется для обозначения объектов, но, по крайней мере, он имеет смысл...:-)
В языке, подобном C, объекты должны создаваться с нуля, с использованием некоторых приемов (воссоздание C++, как-то...), поэтому они не первоклассные: вы должны передавать указатели, чтобы манипулировать ими.
http://onjava.com/onjava/2003/05/21/delegates.html
другими словами, методы C# являются объектом первого класса, потому что мы можем передать его в другой метод. мы можем использовать методы как любые другие значения (строки, числа, созданный пользователем объект).
Другой пример объектов первого класса, которые вы можете найти необычными в других языках, но C# - это выражения
Когда мы говорим об "первоклассных объектах" под "объектами", мы подразумеваем некоторые понятия языка, а не объекты, которые мы создаем на этом языке. Именно поэтому есть и такие термины, как "первоклассные граждане".
Так, например, Java имеет следующие понятия - Java-объекты, Java-примитивы, поля, методы и другие (под Java-объектами я имею в виду все, что является экземпляром типа Object). Я бы сказал, что в Java и Java-объекты, и Java-примитивы являются первоклассными гражданами в языке.
В C# у нас есть несколько дополнительных концепций, которые мы можем "проверить" на свойства первого класса. Например, делегаты. Мы можем присвоить делегату переменную (дать имя), передать его методу в качестве аргумента, вернуть его из метода, включить в структуры данных (например, иметь словарь делегатов). Поэтому я думаю, что мы можем сказать, что делегаты являются первоклассными объектами в C#. Вы можете продолжить для других понятий C# - события, свойства...
Функциональные языки имеют понятие "функция" и, конечно, это первоклассный гражданин на любом функциональном языке. Я бы сказал, что мы можем назвать язык функциональным языком, если он имеет "функцию" в качестве первоклассной концепции (имя, проход, возврат, включение...).
Таким образом, если какой-то язык приносит некоторые понятия, мы можем "измерить" силу этих понятий на языке, который он сам.
Первоклассные объекты - это те объекты, которые мы создаем без использования ключевого слова new. Обычно мы создаем объекты, используя ключевое слово "new", но некоторые объекты на языке программирования мы создаем без использования ключевого слова "new".
В Java 'String' является объектом первого класса. Это концепция Java, и это не стандартная концепция для всех языков программирования.