Zum Inhalt springen

Vererbung C#


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe mehrere Fragen zu der Vererbung:

Das Konzept ist ja so, dass eine Unterklasse von einer Basisklasse erben kann.

Die Unterklasse hat dann noch weitere Felder also Bsp:

class A

{

public int wert;

}

class B:A

{

public int zähler;

}

=> Die Klasse B enthält nun die Variablen: wert und zähler.

Nun mein Problem:

Wenn ich ein Objekt anlegen möchte:

// Ein neues Objekt von der Klasse A

A a = new A()

B b = new A() => geht nicht???

Ich verstehe leider nichht warum dies nicht geht? Da die Klasse B enthält ja genau die Felder von A auch?

Oder heißt das ganze: ich lege ein Objekt für die Klasse B an, welches aber die Felder nur von A enthält?

2.

Was bedeutet denn genau das mit dem "dynamischen Typ" und "statischen Typ"

Ist das ganze nur eine Prüfung, ob eine Variable von der Klasse A oder B... ist?

Also (müsste das "dynamische Typ" sein:

a is A // true

b is A // false

Was ist dann der statische Typ?

Geschrieben (bearbeitet)

Hallo,

B ist eine "spezifischere Klasse", das bedeutet, B hat mehr Felder und/oder Methoden als A. Deswegen kannst du eine Referenz von Typ B nicht auf ein Objekt von Typ A zeigen lassen. B b = new A(); geht also nicht. Was du allerdings machen kannst ist:


B b = new B();   //Ein Objekt vom Typ B wird erstellt


A a = b;    //Eine Referenz vom Typ A auf b

So kannst du allerdings nur die Felder und Methoden von A aufrufen. zu 2. Zu dem "is": Wenn du z.B. bei einer Methode als Parameter eine Referenz auf ein Objekt von Typ A kriegst kannst du auch eine Objektreferenz auf ein Objekt mitgeben, das von A geerbt hat (in dem Fall ein Objekt vom Typ B). Nun kannst du wie folgt abfragen, ob das übergebene Objekt vom Typ B ist und dann eine neue Referenz auf das Parameter Objekt zeigen lassen mit dem Wort "as" B. Ich mach mal ein Beispiel:

public void Test(A a)

{

       a.zaehler = 3;   //GEHT NICHT! weil a die Variable zaehler nicht besitzt


       if (a is 

       {

               B b = a as B;      //Eine Referenz vom Typ B auf ein Typ B Objekt

                                      //(was es ja eigentlich dann ist)

               b.zahler = 3;        //Geht jetzt

       }

}

[/code]

Ich hoffe du verstehst die Antwort. Ich glaube sie ist etwas zu kompliziert geraten. :rolleyes:

Bearbeitet von VitaminB
Geschrieben

Ok, verstanden hab ich es eigentlich...

Aber könntest du zu 2. dich noch allgemein halten:

Sprich sagen, wann ich diese "is" brauche?

Dient dies nur zur Abfrage, ob ein Parameter vom Typ A oder B ist?

Geschrieben

Mit "is" kannst du abfragen, ob eine Klasse eine Schnittstelle implementiert oder welchen Typ dein Objekt hat.

Wie vorher gesagt, kannst du ja eine Referenz vom Typ A auf ein B Objekt machen. Mit "is" kannst du dann z.B. abfragen, ob es ein Objekt vom Typ B ist, und dann eine neue Referenz vom Typ B auf das Objekt machen, um die Methoden und Felder der Klasse B anzusprechen.

z.B.


if (a is IDisposable)

{

       //Tue etwas

}

oder:

if(a is 

{

       //Tue etwas

}

[/code]

  • 5 Monate später...
Geschrieben

Hi,

ich habe eine ähnliche Frage zur Vererbung:

class A

{

public int a;

}

class B : A

{

public int b;

}

Warum kann man nicht auf die Felder von B zugreifen, wenn

A test = new B();

test.a = 12; //okay

test.b = 4; // CS1061 ???????

Und wenn dem so ist, was für einen Sinn macht diese Möglichkeit überhaupt?

Vielen Dank

Jan

Geschrieben

Du "packst" ein Object B in ein A object.

Somit kannst du nur auf Felder und Methoden des Objects A zugreifen.

Ein ausführlichere Erklärung wurde schon weiter oben gepostet.

Noch ein Tipp.

Denkt daran, so gut wie alles wird auch vom Typ Object abgeleitet und verhält sich genauso?

Das könnte deine letzte Frage beantworten ;)

Geschrieben (bearbeitet)

Danke.

Also, da sich alle von object ableiten lassen, können auch Variablen vom Typ object auf alle Typen verweisen. Richtig?

object obj;

Test_A Test = newA();

obj = Test;

Will ich jetzt also auf die Felder von Test über obj zugreifen, dann nur so:

((Test_A)obj).EinFeld = irgendwas;

oder

Test_A Zweiter_Test = (Test_A)obj;

Zweiter_Test.EinFeld = irgendwas;

Die explizite Umwandlung ist ja nötig. Richtig?

LG Jan

Bearbeitet von JanHe76

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...