Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Vererbung C#

Empfohlene Antworten

Veröffentlicht

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?

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

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?

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...

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

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 ;)

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.