Benutzer mit den meisten Antworten
(C#)Objekt bei einer vererbten Klasse?

Frage
-
Hallo,
Ich versuchte einen Objekt bei einer vererbten Klasse zu erstellen.
Aber es taucht nicht in der main methode auf obwohl die Klasse public ist.
Kann mir jemand helfen? Danke
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication27 { class Program { static void Main(string[] args) { auto bugatti = new auto(); Console.WriteLine("{0}", bugatti.Geschwindigkeit); Console.ReadLine(); } } public class auto { public int Geschwindigkeit = 33; private int geschwindigkeit { get { return Geschwindigkeit; } set { value = Geschwindigkeit; } } public class LKW : auto { public int Tonnen; private int tonnen { get { return Tonnen; } set { Tonnen = value; } } } } }
Antworten
-
Hallo zusammen,
Thomas Version 1 ist "seltsam" gelöst. Man muss der Methode ein Objekt von der Instanz übergeben, auf der man die Methode überhaupt aufruft. Das habe ich bisher noch nicht gesehen.
Version 2 entspricht so dem Standard, um einfach zu zeigen das mit MSize wirklich das Feld aus der jetzigen Klasseninstanz ist. Es sei jedoch zu beachten, das man this so gut wie immer weg lassen kann:// * * * * * * //Möglichkeit 2 (mit "this") class MyClass { public int MSize; void GetSize() { return MSize; } } //Aufruf: MyClass o = new MyClass(); int n = o.GetSize();
Der Compiler arbeitet so, das er zunächst innerhalb des aktuellen Blocks (Methode/Eigenschaft) nach dem verwendeten Feld sucht. Sollte dort eine gleichnamige Variable gefunden werden, wird diese verwendet. Wird jedoch keine gefunden, wird innerhalb der Klasse weiter gesucht. Und dort würde es dann MSize finden.
Es gibt jedoch auch Methoden, bei denen this wichtig ist. Beispielsweise:int val=0; public void SetValue(int val){ this.val=val; }
Die Methode entspricht in etwa dem Setter einer Eigenschaft, von daher spielt es eigentlich nur bei Konstruktoren mit Parametern eine wirklich Rolle.
Das Besondere ist, dass der Parameter und das Feld in der Klasse gleich heißen. Wenn du nun this davor schreibst, zeigst du dem Compiler, das du das Feld der Klasse meinst. Ohne this wird der Parameter verwendet.
Eine weitere Verwendungsmöglichkeit von this besteht darin, die aktuelle Instanz an eine andere Klasse zu übergeben. Das wirst du wahrscheinlich erst bei der GUI Programmierung brauchen.Ergänzend zu this gibt es noch base. base entspricht ebenfalls der jetzigen Instanz, jedoch aus Sicht der Basisklasse. Dadurch wird es beispielsweise möglich den Basisklassenkonstruktor oder andere Dinge der Basisklasse aufzurufen, die du in der jetzigen Klasse überschrieben hast.
Ich gebe Thomas aber recht, das this die Leserlichkeit erhöhen kann, weil man sofort weiß, ob das angesprochene in der Klasse oder lokal vorliegt.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert schuayb Kazrabatli Sonntag, 14. Dezember 2014 18:04
-
Ich gebe zu, Koopakiller, das die 1. Version seltsam ist, diese soll aber auch nur einen Vergleich zeigen.
Mir ist klar, dass kein normaler Mensch so etwas machen würde (zumindestens nicht in c#)!
Das soll aber auch nur einen inhaltlichen Vergleich zeigen, um "this" zu erklären.
(C) 2014 Thomas Roskop
- Als Antwort markiert schuayb Kazrabatli Sonntag, 14. Dezember 2014 18:04
Alle Antworten
-
Hallo,
ich verstehe nicht so ganz, was du vor hast. Dein Code ist zumindest syntaktisch richtig.Angenommen, du willst auf die Tonnen des LKWs zugreifen, dafür musst du explizit einen LKQ erstellen:
//das auto. muss davor, weil LKW eine verschachtelte Klasse ist auto.LKW bugatti = new auto.LKW();
Dann kannst du auch entsprechend Tonnen abfragen.
Bei einem Problem mit einem Fehler solltest du am besten die fehlerhafte Codezeile kenntlich machen und den exakten Wortlaut des Fehlers mit posten.
Und nur weil IntelliSense (u. A. die Vorschlagliste) etwas nicht anzeigt heißt das nicht zwingend, das etwas nicht geht. Sicherheit bietet nur das Erstellen der Projektmappe.Noch ein paar allgemeine Dinge zu deinem Code:
- Auto sollte groß geschrieben ein.
- Felder private, Eigenschaften public
- Entsprechend die öffentlichen Eigenschaften groß- und die privaten Felder klein geschrieben.
- Verschachtelte Klassen sind für so etwas i.d.R. ungeeignet. LKW sollte direkt im Namespace liegen.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo.
Zuerst muss ich Koopakiller recht geben, dass auto muss Auto heißen, weil es sonst mit dem Schlüsselwort Probleme gibt (c# auto).
Ich persönlich hätte es so gemacht:
public class NormalCar { private int _speed = 0; public int Speed { get { return this._speed; } set { this._speed = value; } } public NormalCar() { this.Speed = 50; //normales Auto } } public class BugattiCar : NormalCar { public BugattiCar() { this.Speed = 100; //Sehr schnelles Auto } } //... // Main() - Methode public static void Main(string[] args) { NormalCar c = new NormalCar(); BugattiCar b = new BugattiCar(); Console.WriteLine( "Normales Auto: " + c.Speed.ToString()); Console.WriteLine( "Bugatti Auto: " + b.Speed.ToString()); }
Verschachtelte Klassen sind vorallem bei internen Benutzungen sinnvoll, wenn es aber freigegeben werden soll, dann lieber einzeln machen.
(C) 2014 Thomas Roskop
-
Hinweis: auto gibt es nur in C++, das entspricht in etwa dem C# Schlüsselwort var.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo.
"this" ist ein Schlüsselwort und bezieht sich auf die drunterliegende Klasse.
Alle wenn du "this" in einer Klasse verwendet, gibt es die aktuelle INSTANZ der aktuellen KLASSE zurück.
Also so, als ob du direkt auf die Variable zugreifst.
PS: Du kannst das this auch weg lassen, der Compiler erkennt es auch so. Es ist eigentlich nur für die Übersicht (meistens) wichtig.
Vergleiche:
//Möglichkeit 1 (Ohne explizietes / implizites "this") class MyClass { public int MSize; void GetSize(MyClass instance) { return instance.MSize; } } //Aufruf: MyClass o = new MyClass(); int n = o.GetSize(o); // * * * * * * //Möglichkeit 2 (mit "this") class MyClass { public int MSize; void GetSize() { return this.MSize; } } //Aufruf: MyClass o = new MyClass(); int n = o.GetSize();
Man sieht, das beide Möglichkeiten zwar auf das selbe hinausführen, aber das die Version mit this wesentlich übersichtlicher ist.
(C) 2014 Thomas Roskop
-
Hallo zusammen,
Thomas Version 1 ist "seltsam" gelöst. Man muss der Methode ein Objekt von der Instanz übergeben, auf der man die Methode überhaupt aufruft. Das habe ich bisher noch nicht gesehen.
Version 2 entspricht so dem Standard, um einfach zu zeigen das mit MSize wirklich das Feld aus der jetzigen Klasseninstanz ist. Es sei jedoch zu beachten, das man this so gut wie immer weg lassen kann:// * * * * * * //Möglichkeit 2 (mit "this") class MyClass { public int MSize; void GetSize() { return MSize; } } //Aufruf: MyClass o = new MyClass(); int n = o.GetSize();
Der Compiler arbeitet so, das er zunächst innerhalb des aktuellen Blocks (Methode/Eigenschaft) nach dem verwendeten Feld sucht. Sollte dort eine gleichnamige Variable gefunden werden, wird diese verwendet. Wird jedoch keine gefunden, wird innerhalb der Klasse weiter gesucht. Und dort würde es dann MSize finden.
Es gibt jedoch auch Methoden, bei denen this wichtig ist. Beispielsweise:int val=0; public void SetValue(int val){ this.val=val; }
Die Methode entspricht in etwa dem Setter einer Eigenschaft, von daher spielt es eigentlich nur bei Konstruktoren mit Parametern eine wirklich Rolle.
Das Besondere ist, dass der Parameter und das Feld in der Klasse gleich heißen. Wenn du nun this davor schreibst, zeigst du dem Compiler, das du das Feld der Klasse meinst. Ohne this wird der Parameter verwendet.
Eine weitere Verwendungsmöglichkeit von this besteht darin, die aktuelle Instanz an eine andere Klasse zu übergeben. Das wirst du wahrscheinlich erst bei der GUI Programmierung brauchen.Ergänzend zu this gibt es noch base. base entspricht ebenfalls der jetzigen Instanz, jedoch aus Sicht der Basisklasse. Dadurch wird es beispielsweise möglich den Basisklassenkonstruktor oder andere Dinge der Basisklasse aufzurufen, die du in der jetzigen Klasse überschrieben hast.
Ich gebe Thomas aber recht, das this die Leserlichkeit erhöhen kann, weil man sofort weiß, ob das angesprochene in der Klasse oder lokal vorliegt.
Tom Lambert - C# MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert schuayb Kazrabatli Sonntag, 14. Dezember 2014 18:04
-
Ich gebe zu, Koopakiller, das die 1. Version seltsam ist, diese soll aber auch nur einen Vergleich zeigen.
Mir ist klar, dass kein normaler Mensch so etwas machen würde (zumindestens nicht in c#)!
Das soll aber auch nur einen inhaltlichen Vergleich zeigen, um "this" zu erklären.
(C) 2014 Thomas Roskop
- Als Antwort markiert schuayb Kazrabatli Sonntag, 14. Dezember 2014 18:04