Klasse Zusammensetzung in Objective-C Frage: Ist es möglich, eine Klassenvariable zu erben?

StackOverflow https://stackoverflow.com/questions/1972727

  •  21-09-2019
  •  | 
  •  

Frage

Um Hilfe zu sammeln, ein Gefühl von Objective-C Ich erstelle einen sehr Grund connect 4 Spiel sans Cocoa.

In meinem Programm Ich habe drei Module:

        
  • „Game“: Enthält ein Array, das die Karteninformationen hält. Objekt, das innerhalb des Haupt erstellt wird, und ist verantwortlich für die Kurven. Spieler und Computer-Objekte leben in diesem Modul.
  •     
  • „Player“: Hält eine Funktion, dass ein Spieler die Einsätze Stück in die bevorzugte Säule (dieses Modul zum Zwecke der Verkapselung besteht, und nur das)
  • .     
  • „Computer“. Funktionen enthält, die, basierend auf aktuellen Board-Setup zu bestimmen, in dem der Computer soll, und legt dann ein Stück an dieser Stelle bewegen

Im Idealfall würde ich für die Spieler und Computer-Klassen wie die gleiche Instanz von pieceLoc zu bearbeiten zu können, dass das Leben im Spiel durch eine Art der Vererbung, aber ich bin nicht sicher, wie dies zu tun.

Hier ist ein Ausschnitt von dem, was ich zur Zeit bin darüber nachzudenken:
// startGame exists within the "Game" module

char *pieceLoc[42]; // This is a *temporary* global var. I'm still learning about
                    // the best way to implement this with class and instance 
                    // methods. This is the array that holds the board info.

-(void) startGame {
 Player   *player   =[[Player alloc] init]; // player's symbol = 'X'
 Computer *computer =[[Computer alloc] init]; // computer's symbol = 'O'

 int i = 0;
 while ([game hasPieceWon: 'X'] == NO && [game hasPieceWon: 'O'] == NO) {
  //function for player move

      if ([game hasPieceWon: 'X'] == NO) {
      //function for computer move
      } 
  }
 if ([game hasPieceWon: 'X'] == YES)
   // Tell the player they've won 
 else
  // Tell the player the computer has won.

}

Die Funktionen für Spieler und Computer bewegt verwendet werden, sind die Funktionen, die irgendwie brauchen würde, Zugriff auf das Array pieceLoc zu erhalten (die als Instanzvariable in der Zukunft geben wird, wenn ich mehr über Klasse vs. Instanzmethoden lernen). pieceLoc existiert derzeit als char *, falls ich habe es Parameter über Funktion zu übergeben.

Ich fühle mich, als ob dies ein ziemlich einfaches Problem ist, wie ich über OOP denke, aber ich war nicht in der Lage, eine Antwort zu finden, was ich suchte für fast den ganzen Nachmittag trotz der Suche. Von dem, was ich meine Frage habe gesammelt bezieht sich auf Klassenzusammensetzung, aber ich konnte eine gute Ressource zu, dass nicht für Objective-C finden.

Also, noch einmal: Ich bin auf der Suche nach einer Möglichkeit, eine einzelne Instanz pieceLoc passiert, dass das Leben in „die übergeordneten Klasse“ Game zu zwei „Kinder-Klassen“, wo pieceLoc direkt manipuliert werden, ohne mit zusätzliche Parameter.

Wenn das Bestehen die Array als Parameter nicht am Ende wird die mehr idiomatische Sache zu tun, würde ich in der Lage sein, ein Beispiel davon, wie unter Bezugnahme vorbei arbeitet in Objective-C?

Danke für die Hilfe!

War es hilfreich?

Lösung

Wie Sie wahrscheinlich bereits herausgefunden, Objective-C nicht wirklich „Klassenvariablen“ hat, dass Sie von einer Superklasse erben können.

Eine Möglichkeit, diese so zu konstruieren, dass Sie so etwas wie diese nicht globalen Variable haben müssen wäre:

Sie haben ein Spiel-Objekt, das Verweis auf jedem des Spielers und den Vorstand hält. Die Spieler sind entweder jeweils mit einem Verweis auf den Vorstand initialisiert. Ihre startGame Methode (in Spiel) würde Code wie folgt aussehen:

board = [[Board alloc] init];
player = [[Player alloc] initWithBoard: board];
computer = [[ComputerPlayer alloc] initWithBoard: board];

in der Klasse Board würden Sie Methoden haben den Zustand der Platte abzufragen, einen Schritt machen, festzustellen, ob eine Bewegung legal ist, und vielleicht, ob ein Spieler gewonnen hat (obwohl die Spiel-Regel bezogene Logik vielleicht in Game).

In den initWithBoard Methoden in Spielern und ComputerPlayer, dann würden Sie nur die Board Instanz behalten, und es verwenden, um die Bewegungen zu kommunizieren jeder Spieler zu machen entscheidet. Das Spiel würde die Reihenfolge der Bewegungen etabliert, und verfolgt jeden globalen Zustand. Wenn der Spieler und ComputerPlayer werden am Ende des Spiels veröffentlicht, würden sie ihre Bezugnahme auf das Brett in ihrer dealloc Methode freigeben.

Andere Tipps

Da Objective-C nicht Klassenvariablen hat pro-se (sie sind lediglich simuliert mit statischen Variablen) können Klassen Kind nur direkt die statische Globals zugreifen, wenn Sie die Methode in derselben Quelldatei / Übersetzungseinheit definieren. Dies bricht andere Best Practices (eine Klassendefinition pro Übersetzungseinheit). Die übliche Vorgehensweise für den Zugriff Klassenfeldern, ist die Verwendung Accessoren.

In diesem Fall seien Sie vorsichtig, was Sie tun Paar den Klassen zu dicht. Übergeben die Platte (als ein Objekt, kein Array) an der Player (Person könnte ein besserer Name sein, wie ein Computer auch einen Spieler) und Computer, ob als Methodenparameter oder eine Eigenschaft, flexibler ist als Bezugnahme auf einem global oder auf ein statisches Mitglied einer anderen Klasse. Die Spielerobjekte entscheiden, wo man Platz, dann das Board sagen, wo das Stück zu platzieren. Alternativ geht das Spiel eine schreibgeschützte Version der Platte zu einem Spieler; der Platzierungsmethode kehrt der Spieler, wo ein Stück zu platzieren. Für eine Sache, Entkoppeln und ein Board-Objekt mit Betrug verhindern. Stellen Sie sich jemanden einspritzt ihre eigenen Spieler-Klasse, die sie stellen mehrere Stücke auf die Reihe lässt. Zum anderen macht die indirection es einfacher Netzwerk-Unterstützung (Nachrichten zwischen Objekten werden Netzwerk-Nachrichten in einem Prozess, der auf die lokalen Objekte transparent ist) hinzuzufügen.

Denken Sie auch an, wo die Spieler geschaffen. Es könnte mehr Sinn machen, etwas zu haben, sonst die Spieler erstellen und ihnen die startGame Methode übergeben. Dies würde Sinn machen, wenn die Spieler in einem Turnier im Wettbewerb, zum Beispiel, und die Spielerobjekte somit länger als ein einzelne Spiel existieren erforderlich.

Klasse Zusammensetzung bezieht sich auf ein Objekt ein anderer als ein Mitglied aufweisen. C zum Beispiel unterstützen nicht Vererbung, aber Sie nisten structs lassen. Ein anderer Weg, dies zu sagen ist, dass Klassenzusammensetzung ist über „hat-eine“ Beziehungen, während Vererbung über „is-a“ Beziehungen. Die Spielerklassen, zum Beispiel, könnten einen Zeiger auf das Brett haben, die jeweils Verwendungen Ort Stücke.

Objective-C hat auch nicht Pass-by-reference. Stattdessen verwendet es Zeiger.

Also, stellen Sie sicher, dass Ihre Spiel Griff Binder. Vielleicht möchten Sie das Spiel Schleife zu vereinfachen, dies zu erreichen. In Pseudo-Code,

// nextPlayer returns 'nil' if game is over (win or tie)
while currPlayer := [game nextPlayer]:
    // player will tell board where to place piece
    [currPlayer move]

Oder:

// nextPlayer always returns a valid player
while currPlayer := [game nextPlayer]:
    // player's method returns what and where to place
    [self place:[currPlayer move] for:currPlayer]
    // explicitly test for game end, which includes wins & ties
    if [game isOver]:
        break
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top