Hallo zusammen,
ich habe mal ne einfache Frage zu Objekten und Speicherbereichen. Ich habe im Internet leider keine Antwort dazu gefunden deswegen versuche ich es mal hier.
Ich habe die folgenden zwei Klassen:
namespace Luftfahrzeug
{
public class Luftfahrzeug
{
public string Hersteller { get; set; }
public int Baujahr { get; set; }
public void Starten()
{
Console.WriteLine("Das Luftfahrzeug startet.");
}
}
}
und die folgende Ableitung:
namespace Luftfahrzeug
{
public class Flugzeug: Luftfahrzeug
{
public double Spannweite { get; set; }
public new void Starten()
{
Console.WriteLine("Das Flugzeug startet.");
}
}
}
Jetzt zu meiner eigentlichen Frage.
In meinem Programm erstelle ich ein Subklassenobjekt und weise dem den Hersteller Boing zu.
Flugzeug Segelflugzeug= new Flugzeug();
Segelflugzeug.Hersteller ="Boing";
Beim erstellen des Objektes wird ja der implizit vorhandene Basisklassenkonstruktor und der Subklassenkonstruktor ausgeführt. Werden in diesem Fall von beiden Objekten eine Instanz erstellt? Und wie groß ist der Speicherbereich für das Subklassenobjekt wird hier auch Speicher für die Eigenschaften der Basisklasse reserviert in diesem Fall für den Hersteller?
Über eine Antwort würde ich mich freuen.
Viele Grüße
Arne
Hallo,
Werden in diesem Fall von beiden Objekten eine Instanz erstellt?
Nein. Du bekommst eine Instanz, die sowohl die geerbten als auch die eigenen Properties/Felder/Methoden enthält.
wird hier auch Speicher für die Eigenschaften der Basisklasse reserviert in diesem Fall für den Hersteller?
Das hängt davon ab, was Du unter "reserviert" versthst, aber grundsätzlich würde ich sagen ja.
Zumindest wird für Member von _Referenztypen _der Speicherbereich zum Ablegen der jeweiligen _Referenz _reserviert (also nur so viel wie eine Speicheradresse eben braucht). Für Werttypen wird soviel Speicher reserviert, dass die Struktur hineinpasst.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Vielen Dank schon mal für die schnelle Antwort.
Dann habe ich das irgendwie noch nicht richtig verstanden.
Wenn ich eine abstrakte Basisklasse habe die nur abstrakte Methoden hat und beispielsweise eine Eigenschaft, welche Public ist und nicht abstrakt wie hier z.B. Hersteller.
Die Subklasse Flugzeug leitet die abstrakte Basisklasse ab und implementiert alle abstrakten Methoden. Dann kann ich ein Subklassenobjekt erstellen und dem den Herstellernamen zuweisen obwohl der in der abstrakten Basisklassse steht, von welcher ich ja keine Instanz erstellen kann.
Wird dann Speicher in größe des Subklassenobjekts allokiert inklusive der Eigenschaft Herstellername aus der Basisklasse? Irgendwie fehlt mir da das Verständnis.
Hallo,
Wird dann Speicher in größe des Subklassenobjekts allokiert inklusive der Eigenschaft Herstellername aus der Basisklasse?
Ja, exakt. Denn der Compiler weiss ja schon durch die Vererbung, was das Subklassenobjekt alles erben muss.
Was abstrakte und virtuelle Funktionen angeht, da steckt etwas mehr "Magic" dahinter. Im Prinzip wird eine Tabelle darüber aufgebaut, welche Klasse welche Funktionen überschreibt, so dass zur Laufzeit auch dann die Implementierung der Subklasse aufgerufen werden kann, wenn der Aufruf über die Basisklasse erfolgt.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Super vielen Dank Mr Marstein 😉.
Gibt es dazu im Internet noch Literatur, welche du empfehlen kannst?
Viele Grüße
Arne
Im Prinzip wird eine Tabelle darüber aufgebaut, welche Klasse welche Funktionen überschreibt, so dass zur Laufzeit auch dann die Implementierung der Subklasse aufgerufen werden kann, wenn der Aufruf über die Basisklasse erfolgt. Es wäre dann aber besser das er Luftfahrzeug.Starten() virtuell macht und Flugzeug..Starten() mit override dekoriert.
Super vielen Dank Mr Marstein 😉.
Gibt es dazu im Internet noch Literatur, welche du empfehlen kannst?
Viele Grüße
Arne
Einen Zusammenhängendes PDF oder so kenne ich jetzt nicht. Zu den einsenden Bereichen der Speicherverwaltung in .NET gibt es aber etliche Artikel zu den einzelnen Belangen (meist Englisch und über passende englische Suchbegriffe zu finden).
Die Grundlagen zu verstehen kann sicher nicht schaden, sich da im Detail einzuarbeiten ist aber meistens nur Interessant wenn man Speicherprobleme hat. Du arbeitest da so viele Ebenen höher, das ist fast schob so als ob ein Pilot wissen müsste wie Flugzeugkerosin Raffiniert wird 😉.
Sollte man mal gelesen haben:
Vielen Dank Witte und Palin für eure Antworten.
Na da geb ich dir natürlich Recht Palin ist einfach reines Interesse 😉.