this (programowanie obiektowe)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

this - w wielu obiektowych językach programowania, słowo kluczowe odnoszące się w niestatycznych metodach klasy do obiektu na rzecz którego dana metoda została wywołana.

W Smalltalku zamiast this używane jest słowo kluczowe self.

Zależnie od użytego języka, this jest interpretowane jako:

Użycie this[edytuj | edytuj kod]

Sytuacje w których użycie this jest niezbędne:

  • Zwrócenie referencji danego obiektu z metody lub przekazanie jako parametr do innej funkcji/metody np. (przykład w C++):
class Wektor {
  public:
    Wektor& operator = ( const Wektor& wzorzec ) {
      x = wzorzec.x;
      y = wzorzec.y;
      return *this; // zwrócenie referencji
    }
  private:
    double x;
    double y;

  /* ... */
};
  • W celu odróżnienia nazw zmiennych w klasie i nazw parametrów formalnych metody w przypadku gdy są takie same np. (przykład w Javie):
class Wektor {
  private double x;
  private double y;

  public Wektor( double x , double y ) {
    this.x = x; // rozróżnienie parametrów formalnych konstruktora od zmiennych w klasie
    this.y = y;
  }

  /* ... */
}
  • Wywołanie innego konstruktora z ciała konstruktora tej samej klasy (Java).
class Person {
  private String name;
  private Date dateOfBirth;

  public Person( String name ) {
    this( name , new Date() ); // Wywołanie innego konstruktora w klasie.
  }

  public Person( String name , Date dateOfBirth ) {
    this.name = name;
    this.dateOfBirth = dateOfBirth;
  }

  /* ... */
}

Podczas tworzenia obiektu przy użyciu jednoargumentowego (np.: new Person( "Jan Kowalski" )) konstruktora spowoduje wywołanie z jego wnętrza konstruktora dwuargumentowego w którym to pola w klasie są docelowo ustawiane.

this a konwencja nazewnicza[edytuj | edytuj kod]

Jednym z popularnych sposobów wyróżnienia pola w klasie od zmiennej lokalnej w metodzie jest użycie przedrostka "m_" w nazwie zmiennej np: m_date, m_name. Przedrostek ten pochodzi od angielskiego member czyli członek (w tym wypadku członek klasy). Technika ta wymusza aby każde pole w klasie rozpoczynało się od "m_" co w zależności od środowiska pracy może być uciążliwe np. podczas sortowania po nazwie. Alternatywą dla tego sposobu oznaczania członków klasy jest użycie this - nawet wtedy, gdy nie jest to konieczne. Pozwala to posiadać nazwy zmiennych zgodne z zamierzeniami np.: date czy name a ich użycie w kodzie będzie wyglądało odpowiednio: this.date i this.name.

Samobójstwo obiektu[edytuj | edytuj kod]

W C++ this jest interpretowany jako wskaźnik. Z tego powodu możliwa jest konstrukcja, w której obiekt popełnia samobójstwo. Realizuje się to poprzez wywołanie delete this; w ciele metody obiektu:

class Samobojca {
  private int dana;

  public void zabijSie() {
    dana = 1;    // ok
    delete this;
    // dana = 2; // błąd, obiekt juz nie istnieje
  }
}

Aby mechanizm samobójstwa zadziałał bez błędów obiekt musi być stworzony na stercie czyli inaczej mówiąc przy użyciu operatora new. Należy również pamiętać, że od momentu wykonania delete this;, obiekt przestaje istnieć i wszelkie odwołania do pól obiektu spowodują naruszenie ochrony pamięci.

Z praktycznego punktu widzenia samobójstwo obiektu jest stosunkowo rzadko spotykane a używanie tego mechanizmu świadczy o błędzie w koncepcji programu.