Laden...

Abgeleitete Klassen und Objekte (Benötigter Speicher)

Erstellt von arvbar vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.165 Views
A
arvbar Themenstarter:in
23 Beiträge seit 2013
vor 8 Jahren
Abgeleitete Klassen und Objekte (Benötigter Speicher)

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

3.170 Beiträge seit 2006
vor 8 Jahren

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

A
arvbar Themenstarter:in
23 Beiträge seit 2013
vor 8 Jahren

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.

3.170 Beiträge seit 2006
vor 8 Jahren

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

A
arvbar Themenstarter:in
23 Beiträge seit 2013
vor 8 Jahren

Super vielen Dank Mr Marstein 😉.
Gibt es dazu im Internet noch Literatur, welche du empfehlen kannst?
Viele Grüße
Arne

W
955 Beiträge seit 2010
vor 8 Jahren

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.

P
1.090 Beiträge seit 2011
vor 8 Jahren

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:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

A
arvbar Themenstarter:in
23 Beiträge seit 2013
vor 8 Jahren

Vielen Dank Witte und Palin für eure Antworten.
Na da geb ich dir natürlich Recht Palin ist einfach reines Interesse 😉.