Frage

Als ich anfing OO vielen Jahren Programmierung vor ich den Eindruck gewonnen, dass Variablen (wenn das das richtige Wort ist) waren entweder „primitives“ (int, double, etc.) oder First-Class-Objekte (String, JPane usw. ). Dies wird durch eine aktuelle Antwort auf Primitiven in Java und C # (@ Daniel Pryden verstärkt: sind primitive Typen unterscheiden sich in Java und C #? ). Allerdings wissen nicht, ob C # ValueTypes sind Grundelemente, Objekte oder ein anderes Tier wie zweitklassige Objekte. Ich sehe, dass dies nur eine Verwendung des first-class Tages hat so vielleicht ist es nicht mehr ein brauchbarer Begriff.

ich nicht finden der Wikipedia-Artikel nützlich ( "Dieser Artikel ist in der Notwendigkeit Aufmerksamkeit von einem Experten zu diesem Thema. "). Ich würde für eine Taxonomie und die aktuellen Nutzung von Begriffen dankbar sein, in erster Linie im Zusammenhang mit Java und C # (obwohl vielleicht anderen Sprachen werden Schuppen Erleuchtung).

Klarstellung . Ich mag den Begriff verstehen, First-Class und was sein Einsatzbereich ist

War es hilfreich?

Lösung

Das Problem ist, dass "First-Class-Objekt" ist kein gut definiertes Konzept.

Die normale Verwendung ist, dass jemand sagt, dass ein „Objekt“ ist eine Klasse von Dingen, die sollte hat alle Eigenschaften X, Y und Z. Aber es gibt andere Dinge, die nicht über alle diese Eigenschaften, aber sie sind eine Art von Objekt-ish. Also haben wir die ehemaligen „first class“ Objekte und den Rest nicht „first class“ nennen wollen ... und möglicherweise nicht Objekte.

Das Problem ist, dass es eine beliebige Anzahl von Ansichten über die Eigenschaften, dass eine Sache, es haben zu machen muss ein „erste Klasse“ Objekt. Und keine Aussicht auf den Menschen mit unterschiedlichen Ansichten kommen zu einem Konsens. (Zum Beispiel kann ein Experte Javascript Sprache könnte strenuously argumentieren, dass ein Objekt nur erste Klasse ist, wenn es Vorlage basiert.)

Die einzige wirklich soliden Erkenntnisse über die „first-classness“ diejenigen sein, dass Sie von den jeweiligen Sprach Spezifikationen für Java und C # auflesen können. Und sie gelten nur wirklich im Rahmen der jeweiligen Sprachen / Typsysteme ... und nicht über mehrere Sprachen.

So „erste Klasse Java-Objekt“ oder „erstes Klasse C # Objekt“ könnte sinnvoll sein, aber „Klassenobjekt“ von Kontext herausgenommen ist es nicht.

Nun, das ist meine Meinung ...

Andere Tipps

Der Begriff der "Bürger erster Klasse" oder "First-Class-Element" in einer Programmiersprache wurde von den britischen Informatiker eingeführt Christopher Strachey in den 1960er Jahren im Rahmen des First-Class Funktionen. Die berühmteste Formulierung dieses Prinzips ist wahrscheinlich in Struktur und Interpretation von Computerprogrammen von Gerald Jay Sussman und Harry Abelson:

  • Sie können durch Variablen genannt werden.
  • Sie können als Argumente an Prozeduren übergeben werden.
  • Sie können als die Ergebnisse der Verfahren zurückgeführt werden.
  • Sie können in Datenstrukturen enthalten sein.

Im Grunde bedeutet es, dass Sie mit dieser Programmiersprache Element alles tun können, dass Sie mit allen anderen Elementen in der Programmiersprache tun können.

In .NET Sie haben keine primitiven Typen vs Klassen. Stattdessen müssen Sie structs vs Klassen, aber structs teilen viele der Funktionen der Klassen (wie die Fähigkeit, Eigenschaften und Methoden haben), und erbt von der Object Klasse auch.

Wenn Sie int in C #, zum Beispiel schreiben, ist es nur eine Sprache Abkürzung für die Int32 Struktur. Sie können zum Beispiel int i=int.Parse("34") oder sogar string s=1234.ToString() tun. Um assign struct Instanzen Variablen vom Typ Object gibt es die Boxen / Unboxing Mechanismus .

In Java, auf der anderen Seite, haben Sie in der Tat die primitiven Typen vs Klassen dicotomy. So zum Beispiel Operationen auf eine Variable vom Typ int auszuführen, müssen Sie die Hilfs Integer Klasse. Das ist eines der Dinge, dass ich nicht wie von Java im Vergleich zu .NET.

Bearbeiten . Wenn Sie über „First-Class-Objekte“ (oder Klassen) zu lesen, bedeutet es „voll angetriebene Objekte“, das heißt, Klassen, die die gleichen Funktionen wie alle anderen Systemklassen oder vom Anwender erstellten Klassen haben. Dies ist von „beschränkt Urtyp“ zu unterscheiden.

Für jede primitive Datentypen in Java stellt die Kern-Klassenbibliothek eine Wrapper-Klasse, die es als Java-Objekt darstellt. Zum Beispiel wickelt die Int32 Klasse des int-Datentyp und die Doppel Klasse umschließt den doppelten Datentyp.

Auf der anderen Seite sind alle primitiven Datentypen in C # sind Objekte im Namespace-System. Für jeden Datentyp, einen Kurznamen oder Alias, vorgesehen. Zum Beispiel int ist der Kurzname für System.Int32 und doppelt so hoch ist die Kurzform von System.Double.

Die Liste der C # Datentypen und deren Aliase ist in der folgenden Tabelle angegeben. Wie können Sie die ersten acht dieser entsprechen den primitiven Typen in Java sehen. Beachten Sie jedoch, dass Java boolean genannt wird bool in C #.

Von: http: // msdn .microsoft.com / en-us / library / ms228360% 28VS.80, leichtes% 29.aspx

http://onjava.com/onjava/2003/05/21 /delegates.html

Mit anderen Worten c # Methoden sind erstes Klasse-Objekt, weil wir es in einem anderen Verfahren passieren können. wir können Methoden wie alle anderen Werte verwenden (Strings, Zahlen, vom Benutzer erstellte Objekt).

Ein weiteres Beispiel für First-Class-Objekte, die u in anderen Sprachen unüblich finden, aber c # ist Ausdrücke

Ehrlich gesagt, habe ich keine Ahnung davon, was ein „First-Class-Objekt“ ist ...
Aber ich erste Verwendung eines ähnlichen Idiom in Lua Dokumentation und Mailing-Liste zu finden, sagen, dass Funktionen sind Bürger erster Klasse oder erstklassige Werte.

Ich ließ einer der Autoren von Lua zu erklären, was es ist: : 6 - Mehr über Funktionen

  

Es bedeutet, dass, in Lua, eine Funktion a   Wert mit den gleichen Rechten wie   konventionelle Werte wie Zahlen und   Saiten. Funktionen können gespeichert werden   Variablen (sowohl globale als auch lokale) und   in Tabellen können als Argumente übergeben werden,   und kann von anderen zurückgegeben werden   Funktionen.

Irgendwie gilt diese Definition auf Objekte in Java: Sie können sie speichern in Variablen, Arrays, verwenden sie als Funktionsparameter und bringt sie, benutzen sie als Schlüssel von HashMap und anderen Sammlungen etc.
Nicht sicher, ob das, wie der Begriff für Objekte verwendet wird, aber zumindest ist es sinnvoll ...: -)

In einer Sprache wie C, haben Objekte von Grund auf neu gemacht werden, einige Tricks (C ++ neu zu erstellen, irgendwie ...), so dass sie nicht erster Klasse sind: Sie haben Zeiger zu übergeben, um sie zu manipulieren.

Wenn wir reden über „First-Class-Objekte“ von „Objekten“ wir einige Konzepte der Sprache bedeuten, nicht die Objekte, die wir in dieser Sprache erstellen. Deshalb gibt es auch solche Begriffe wie „Bürger erster Klasse“.

So zum Beispiel Java hat folgende Konzepte - Java-Objekte, Java-Primitive, Felder, Methoden und andere (von Java-Objekten Ich meine alles, was Instanz von Object-Typ ist). Ich würde sagen, dass in Java sowohl Java-Objekte und Java-Primitive sind Bürger erster Klasse in der Sprache.

In C # wir einige zusätzliche Konzepte haben, dass wir „Test“ für erstklassige Objekte. Zum Beispiel Delegierten. Wir können delegieren ot Variablen zuweisen (einen Namen geben), geben sie auf das Verfahren als ein Argument, kehren sie von Verfahren, einzuarbeiten in Datenstrukturen (eine Definition von Delegierten zum Beispiel). Also ich, können wir denken, sagen, dass die Delegierten erstklassige Objekte in C # sind. Sie können für andere Konzepte von C # fortsetzen - Ereignisse, Eigenschaften ...

Funktionale Sprachen haben Begriff „Funktion“ und natürlich ist es ein Bürger erster Klasse in der jede funktionale Sprache. Ich würde sagen, dass wir die Sprache eine funktionale Sprache nennen kann, wenn es „Funktion“ als First-Class-Konzept hat (Name, Pass, Rückkehr, incorporate ...).

Also, wenn einige Sprache, einige Konzepte bringen wir können „messen“, die Macht dieser Begriffe in der Sprache selbst es.

Erste-Klasse-Objekte sind die Objekte, die wir ohne die Verwendung von ‚neuen‘ Schlüsselwort erstellen. Normalerweise schaffen wir ein Objekt ‚neues‘ Schlüsselwort aber einen Gegenstand in Sprache Programmierung wir ohne ‚neues‘ Schlüsselwort erstellen.

In Java 'String' ist ein erstklassiges Objekt. Es ist ein Java-Konzept, und es ist kein Stander Konzept für alle Programmiersprachen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top