2012-04-01 5 views
0

Ich studiere Daten archivieren, und ich erkenne die Standard-Sammlung Klassen bieten einfache Archivierung, aber ich möchte eine NSMutableArray archivieren. Also ich lese das seit NSMutableArray "ist ein" weil es eine Unterklasse ist, dann ist das in Ordnung.Unterklasse "ist" Klasse verwirrt mich

Aber diese Idee stopft mich, und mir ist klar, dies ist ein grundlegendes Konzept von Objective-C, also möchte ich sicherstellen, dass ich es richtig mache.

Angenommen, Sie haben eine Klasse "Automobil" mit einer Unterklasse "Jeep." Jetzt auf der Grundlage der oben genannten, können Sie sagen:

automobileInstance=jeepInstance;

... weil ein Jeep eine Unterklasse von Automobil ist.

Aber das scheint mir rückwärts. Ich würde denken, Sie sollten stattdessen sagen, dass eine Unterklasse Instanz in der übergeordneten Klasse Instanz gleich sein:

Jeep = auto

Denn schließlich einen Jeep „ist ein“ Automobil, aber nicht alle Autos sind Jeeps. So

warum dann können Sie dies tun:

NSArray*newArray=nsmutableArrayInstance;

Es ist die gleiche Idee mit den Worten:

automobile=jeep; in meinem Beispiel.

Ihre Unterklasse hat vielleicht viele neue Instanzvariablen hinzugefügt, aber wenn Sie sie gleich einer Oberklasse setzen, sind diese iVars "verloren" oder zumindest die Superklasse erkennt sie nicht, also ist es nicht das Objekt wirklich zu erfassen, würde es scheinen.

Gehen Sie den anderen Weg, sagt die sublass instance = superclass instance macht Sinn, da alles in der Oberklasse in der Unterklasse ist; Sie erhalten nur keine Werte für die zusätzlichen iVars, die sich in der Unterklasse, aber nicht in der Oberklasse befinden, sie können auf den Standardwert Null gesetzt werden, aber sie existieren zumindest.

+1

Objective-C folgt nicht der Satzstruktur der englischen Sprache. –

+2

Bedenken Sie, dass Sie einen Parkplatz für Autos haben. Ein Jeep kann dorthin fahren, weil ein Jeep ein Automobil ist. Aber wenn du einen Parkplatz speziell für Jeeps hättest, könntest du nicht irgendein altes Auto darin stecken, oder? Es könnte kein Jeep sein. Jetzt bedenken Sie, dass "Automobile auto" einen Platz für Automobile (technisch, Zeiger auf Automobile, aber eh) erklärt. Ein Parkplatz, wenn du willst. – cHao

Antwort

1

Denken Sie mal so: Alle Jeeps sind Autos. Nicht alle Autos sind Jeeps. So können Sie sagen:

Automobil a = jeepInstance; // Ein Jeep ist immer ein Automobil

aber nicht:

Jeep j = autoInstance; // schlägt fehl - AutoInstance könnte stattdessen ein Mazda sein.

1

Ein Superklassenzeiger kann auf ein Objekt zeigen, das von der Unterklasse zugewiesen wurde, da die Klassenmitglieder der Oberklasse immer in der Unterklasse vorhanden sind.

autoMobilePointer = jeepObject; // works 

Dies ist umgekehrt nicht der Fall, da die Unterklasse Mitglieder hat, die in der übergeordneten Klasse nicht vorhanden ist.

jeepPointer = autoMobileObject; // doesn't work 
+0

Im Wesentlichen dann, in Ihrem ersten Beispiel verliert Ihr neuer Autozeiger alle Mitglieder in Jeep – johnbakers

+0

effektiv, so dass es nicht über autoMobilePointer zugreifen kann. Ich bin mir ziemlich sicher, wenn Sie diesen Zeiger auf einen JeepPointer werfen, dann könnten Sie - das jeepObject ist, was Sie schließlich im Speicher zugewiesen haben. –

1

Ich denke, das Problem hier ist, dass Sie Zuordnung und Gleichheit verwechseln, und vielleicht auch Klassen und Objekte. Denken Sie daran, dass = Zuweisung bedeutet, während == und -isEqual Tests für die Gleichheit sind.Wenn B eine Unterklasse von A ist, dann ist jeder B ein A, genauso wie jeder Jeep ein Automobil ist, und jeder Mensch ist ein Säugetier.

Aber wenn Sie sagen:

automobile = jeep; 

, was Sie tun, ist der Wert jeep auf die Variable automobile zuweisen. Du bist nicht sagend, dass jedes Automobil in der Welt ein Jeep ist, sagst du, dass die spezifische Variable automobile sich auf eine spezifische Instanz von Jeep bezieht. Es ist genau so, als ob ich dich gefragt hätte:

Welches Auto fährst du?

In meinem Kopf erwarte ich, dass Sie mit Informationen über ein Auto antworten. Sie könnten sagen, dass der Speicherort in meinem Kopf, den ich für Ihre Antwort reserviert habe, Automobile* ist, da es sich auf jedes Auto beziehen könnte. Sie antworten:

Ich fahre diesen roten Jeep in der Nähe des Baumes geparkt.

Es könnte hilfreich sein, aussagekräftigere Namen für Ihre Variablen zu wählen. Verwenden Sie etwas bestimmtes, wie:

Automobile *theCarThatAndrewxDrives = jeep; 

Dies macht es offensichtlich, dass wir über ein bestimmtes Auto sprechen, nicht alle Autos.

Verwandte Themen