Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C# Frage zu "this" (https://www.delphipraxis.net/63958-frage-zu.html)

Pseudemys Nelsoni 25. Feb 2006 07:21


Frage zu "this"
 
Moin,

Das "this" dem "Self" von Delphi entspricht/ähnelt(?) weiss ich seit C++, einen Teil habe ich abe rimmernoch nicht kapiert...

Zitat:

Der this-Zeiger
Wenn Sie sich die beiden Konstruktoren aus dem letzten Beispiel noch einmal genauer ansehen, werden Sie vielleicht zwei kleine Nachteile bemerken: Zum einen heißen die Parameter lediglich a und b und nicht Real und Imaginaer (was wesentlich aussagekräftiger wäre), zum anderen ähneln sich die beiden Konstruktoren extrem und so müssen bei Änderungen wahrscheinlich beide Methoden verändert werden, was eine zusätzliche Fehlerquelle darstellt. Daher wäre es praktisch, den gemeinsamen Code nur einmal unterbringen zu müssen.

Das erste Problem, nämlich dem Konstruktor zwei Variablen namens Real und Imaginaer zu übergeben, scheitert daran, dass der Compiler dann nicht weiß, welche Variable gemeint ist - das Datenelement der Klasse oder der übergebene Parameter.

Um die Parameter trotzdem wie Datenelemente benennen zu können, gibt es den this-Zeiger. Wendet man ihn auf eine Variable an, so verwendet C# das Datenelement der Klasse, andernfalls den gleichnamigen Parameter. Der Konstruktor müsste also folgendermaßen aussehen:
public CKomplexeZahl(double Real, double Imaginaer)
{
this.Real = Real;
this.Imaginaer = Imaginaer;
}
Damit weiß der Compiler, was gemeint ist und kann die Methode problemlos übersetzen.

Auch das zweite Problem, nämlich den Code der Konstruktoren zu vereinfachen, lässt sich mit Hilfe des this-Zeigers lösen. Ruft man einen Konstruktor nämlich auf und hängt ihm - getrennt durch : - das Schlüsselwort this samt eventuellen Parametern an, so wird ein weiterer Konstruktor der Klasse aufgerufen (welcher Konstruktor aufgerufen wird, hängt dann von den Parametern ab).

Da der Aufruf des Konstruktors ohne Parameter dem Aufruf des anderen mit zwei Nullen als Parameter entspricht, kann man ihn entsprechend umschreiben und erhält die folgenden beiden Konstruktoren.
public CKomplexeZahl() : this(0, 0)
{
}

public CKomplexeZahl(double Real, double Imaginaer)
{
this.Real = Real;
this.Imaginaer = Imaginaer;
}
Dieser Code erfüllt den gleichen Zweck wie vorher, aber bei einer Änderung am Code muss nur noch einer der beiden Konstruktoren geändert werden. Das Programm ist also leichter zu überblicken und besser wartbar.
Und zwar ab "Auch das zweite Problem....", ich verstehe nicht was es mit dem ": this(0, 0)" auf sich hat. Was heisst denn dass ein weiterer Konstruktor aufgerufen wird?

FAlter 25. Feb 2006 07:46

Re: Frage zu "this"
 
Hi,

Ich versteh den Text so: mit

Code:
class AClass
{
  public AClass():AClass(param)
  {
  }

  public AClass(.../*ein param*/)
  {
    ...
  }
}
wird bei xyz = new AClass() eigentlich xyz = new AClass(param) aufgerufen. Du kannst also einen Konstruktor ersetzen durch den Aufruf eines anderen Kostruktors derselben Klasse, wobei du einige oder alle Parameter durch deine Stzandardwerte ersetzt.

Mfg
FAlter

*** Tippfehler! Man sollte im Forefox 'ne Rechtschreibprüfung für längere Texte einführen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz