Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Karim

Frischling

  • »Karim« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Düsseldorf

  • Private Nachricht senden

1

05.09.2014, 15:03

Anwedungsbereich für Instanz- und Klassenmethoden

Hallo,

ich habe diesbezüglich im Internet viel gelesen und so weit ist es mir auch klar, aber irgendwo hakt das Verständnis dann doch noch.
Ich pauke gerade Objective-C 3.0 mit dem Video2Brain Tutorial - so weit auch alles kein Problem.
Bin nun am Punkt wo man auf @property und @synthesize eingeht und auch gezeigt wird, wie man Geter und Seter erstellt (mittlerweile ja nicht mehr nötig).

Im Zuge dessen wurden auch die Instanzmethoden mit einem Minus und die Klassenmethoden mit einem + angesprochen.

Mir ist klar, dass ich Instanzmethoden nur aufrufen kann, wenn ich zuvor ein Objekt erschaffe und dass ich Klassenmethoden auch dann aufrufen kann, wenn ich vorher kein Objekt erschaffe.

Meine Frage ist nun aber: Wann ist was sinnvoll und wann sollte ich was nutzen?

Sollte ich immer, wenn die Methode keine Attribute hat, eine Instanzvariable nehmen und immer, wenn die Methode Attribute hat, eine Klassenvariable nehmen?
Oder woran sollte ich dies festmachen?

Danke für die Hilfe im Voraus :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

05.09.2014, 15:29

Da verstehst du noch etwas falsch. Stell dir vor du hast eine Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DoofesBeispiel
{
  private int wert;
  public int MachIrgendwas() {
    wert += 35; // mach irgendwas mit der Variable
    retúrn wert; // gib die Variable zurück
  }

  private static int wert2;
  public static int MachNochMehr() {
    wert2 = wert;                     // Fehler
    wert2 -= MachIrgendwas(); // Fehler
    wert2 += 7;
    return wert2;
  }
}


Die Klasse hat 2 Attribute, wert und wert2. Bei wert2 handelt es sich um ein statisches Attribut. Das bedeutet es ist der Klasse zugehörig und keiner Instanz. Machst du zwei Instanzen von einer Klasse, so hat jede Instanz seine eigene Kopie der Attribute. Das heißt, ändere ich einen Wert in der einen Klasse, so ändere ich damit nicht automatisch einen Wert in einer anderen Klasse. Mache ich das Attribut aber nun statisch, so gehört es nicht mehr einzelnen Instanzen, sondern wird über alle Instanzen und sogar unabhängig davon geteilt. Im oberen Beispiel könntest du über DoofesBeispiel.MachNochMehr() auf eine statische Methode zugreifen. Das ist das selbe nur für Methoden. Soll heißen die Methoden werden nicht auf Instanzen aufgerufen, sondern nur auf der Klasse. Dadurch kannst du in diesen Methoden auch nur auf andere statische (Klassen) Attribute zugreifen. Oben habe ich zwei Zeilen mit Fehler kommentiert. Hier wird ein mal auf wert zugegriffen und danach auf MachIrgendwas(). Beide sind nicht statisch und sind somit Instanzabhängig. In der statischen Methoden MachNochMehr() ist nicht bekannt um welche Instanz es sich handelt. Also funktioniert das nicht.
Anwendungsfälle gibt es verschiedene. Ein doofes Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GameEntity
{
  private static int nextID = 0;

  private int myID;

  GameEntity() {
    myID = nextID;
    nextID++;
  }

  public int GetMyID() {
    return myID;
  }
}


Jedes mal wenn du eine Instanz von GameEntity erzeugst wird myID eine neue ID zugewiesen. Die erste Instanz bekommt die ID 0, die zweite bekommt die ID 1, die dritte die 2 und so weiter. Beachte nextID ist statisch und gilt so Instanzenübergreifend. Teste es vielleicht einfach mal selber und spiel ein wenig damit rum. Am Anfang benötigt man sowas meiner Meinung nach relativ selten. Wann du es wo und wie einsetzt merkst du mit der Zeit schon. Wichtig ist erst mal dass du weißt dass es das gibt und es verstehst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Karim

Frischling

  • »Karim« ist der Autor dieses Themas

Beiträge: 7

Wohnort: Düsseldorf

  • Private Nachricht senden

3

09.09.2014, 14:07

Hallo Schorsch,

vielen dank für diese super Erklärung! Jetzt wird es deutlicher! :-)
Klasse Hilfe, danke danke danke!

Lieben Gruß
Karim

Werbeanzeige