Есть ли статический язык, в котором класс является объектом? - PullRequest
0 голосов
/ 05 июля 2011

Существует довольно много динамически типизированных объектно-ориентированных языков, в которых сам класс является объектом.Smalltalk и Python, например.Существует ли какой-либо статически типизированный язык, в котором класс является объектом?

РЕДАКТИРОВАТЬ:
Под термином «объект» я подразумеваю сущность первого класса.Например, классы в Python могут быть переданы другим методам, могут быть возвращены из методов и т. Д.

Ответы [ 5 ]

2 голосов
/ 06 июля 2011

Я не совсем согласен с ответом @edutesoy.

Первый класс означает, что неявные конструкции преобразуются в явные конструкции, которые можно передавать как любой объект. Классы в Java не являются «первоклассными», они являются зеркалами, где вы можете проверить некоторые свойства, но не самим объектом.

То, что вы не можете изменить структуру класса во время выполнения, это хорошо, например, добавьте поля, измените тело метода или подпись, и с этой точки зрения это частично «только для чтения», это нормально.

Но давайте рассмотрим статические поля. Я думаю, что все согласны с тем, что если final статические поля не являются изменяемыми, как поля экземпляра В Smalltalk это просто поля, определенные в самом классе, а не в экземплярах класса. Кроме того, в Smalltalk методы на стороне класса полиморфны, как и любой другой метод, и:

aClass field: aValue. 

может разрешаться по-разному в зависимости от переданного класса. Это невозможно в Java; на статическое поле или метод необходимо ссылаться через его тип . Это также означает, что он не позволяет переопределять статические методы (подробнее см. Ссылку), как это было бы в случае, если бы они были действительно первого класса.

Тот факт, что отражение в Java возможно, не делает классы "первоклассными" - вы можете только передать представление класса. И вернемся к первоначальному вопросу: я не знаю ни одного статически типизированного языка с первоклассными классами (но мои знания ограничены, возможно, он существует).

EDIT

На самом деле, теперь я помню, что существует StrongTalk (http://www.strongtalk.org/), то есть Smalltalk со статической типизацией. Вопросы типизации обсуждаются в этой статье: Strongtalk: проверка типов Smalltalk в производственной среде

2 голосов
/ 05 июля 2011

Во многих статически типизированных языках, таких как JAVA , , класс является объектом со своими собственными методами.Например, в Java объект, представляющий класс «String», доступен как «String.class», а затем вы можете вызывать методы этого класса как « String.class.getFields () », "getMethods () ", getConstructor ()", "cast (obj)" и т. д. В документации API вы можете увидеть все методы класса "Class".

Тем не менее,учитывая, что язык статически типизирован, вы не можете динамически изменять класс.

Другими словами , вы не собираетесь найти метод с именем "class. addField ()"в классе Class. Чем больше вы можете сделать, это" расширить "класс (если он не окончательный) путем наследования.

Другими словами , объект "Class" является только для чтения .

Под термином "объект" я подразумеваю сущность первого класса. Например, классы вPython может быть передан другим методам, может быть возвращен из методов и т. Д.

Как и любой другой объект, вы можете передать их методуds и возвращает их из методов (они являются обычными объектами, но открывают только методы "read").Пример (для ясности я опускаю обобщения):

public Class myMethod(Class someClassObject) {
    System.out.println(someClassObject.getCanonicalName());
    Class anotherClass = String.class;
    return anotherClass ;
}
1 голос
/ 10 июля 2012

От Олега Киселева и Ральфа Ламмеля "Система объектов упущения Хаскелла" (акцент мой),

Не только OOHaskell обеспечивает обычные идиомы OO; у нас также есть несколько спроектированных языком функций, которые являются либо передовыми, либо недоступными в основных языках ОО: например, классы первого класса и замыкания классов ; классы коллекций со статической проверкой типов с ограниченным полиморфизмом неявных аргументов коллекции; множественное наследование с управляемым пользователем совместным использованием; безопасный ко-вариант подтип аргумента.

0 голосов
/ 05 июля 2011

Взгляните на концепцию гомойконичности , которая относится к существующему, что язык может ссылаться на свои собственные структуры. Также взгляните на эту статью Эрика Липперта.

0 голосов
/ 05 июля 2011

Ну, преимущества этого уменьшены в раннем языке. Тем не менее, объекты отражения Java для классов в основном будут тем, о чем вы просите.

Почему, кстати, ты этого хочешь? Это больше чем праздное любопытство?

...