rider Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 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? Zitieren
VitaminB Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 (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 . 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. Bearbeitet 17. Dezember 2008 von VitaminB Zitieren
rider Geschrieben 17. Dezember 2008 Autor Geschrieben 17. Dezember 2008 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? Zitieren
VitaminB Geschrieben 17. Dezember 2008 Geschrieben 17. Dezember 2008 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] Zitieren
JanHe76 Geschrieben 13. Juni 2009 Geschrieben 13. Juni 2009 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 Zitieren
Franzose Geschrieben 14. Juni 2009 Geschrieben 14. Juni 2009 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 Zitieren
JanHe76 Geschrieben 14. Juni 2009 Geschrieben 14. Juni 2009 (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 14. Juni 2009 von JanHe76 Zitieren
Empfohlene Beiträge
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.