1. Sie haben folgende Klassenvereinbarung:
class Hund
{
int gewicht;
int alter;
}
Kann eine Klasse KleinerHund, die von der Klasse Hund abgeleitet wird, auf die Felder gewicht und alter der Klasse Hund zugreifen? Begründen Sie bitte Ihre Antwort.
2. Sie haben folgende Vereinbarung einer Klasse Katze:
class Katze
{
int groesse;
public Katze(int groesse)
{
this.groesse = groesse;
}
...
}
Was geschieht, wenn Sie eine neue Instanz der Klasse Katze mit der Anweisung Katze kleineKatze = new Katze();
erzeugen wollen? Begründen Sie bitte Ihre Antwort.
3. Sie haben folgende Klassenvereinbarungen:
class Hund
{
int gewicht;
int alter;
}
class KleinerHund : Hund
{
int groesse;
}
Die Klasse KleinerHund soll auf das Feld alter der Klasse Hund zugreifen können. Welche Möglichkeiten kennen Sie, diesen Zugriff zu ermöglichen? Bewerten Sie diese Möglichkeiten bitte auch. Achten Sie dabei besonders auf die Datenkapselung.
Ein Tipp: Sie sollten mindestens drei verschiedene Varianten nennen können. Zwei hängen direkt mit der Vereinbarung des Feldes zusammen, die dritte dagegen nicht.
4. Betrachten Sie bitte folgendes Quelltextfragment. Es erzeugt ein Array für Instanzen der Klasse Baer und ruft für jedes Element im Array die Methode Ausgeben() auf.
Baer[] Baerenliste = new Baer[2];
Baerenliste[0] = new Baer(200, 3);
Baerenliste[1] = new ElternBaer(500, 5, 20);
foreach (Baer testBaer in Baerenliste)
testBaer.Ausgeben();
Die Klasse ElternBaer ist von der Klasse Baer abgeleitet und verfügt über eine eigene Methode Ausgeben(), die die Methode Ausgeben() der Basisklasse überschreiben soll. Die Methode Ausgeben() der abgeleiteten Klasse ist nicht mit override markiert.
Wird die Methode der Basisklasse tatsächlich überschrieben? Wie lauten die vollständigen Namen der Methoden, die in der Schleife aufgerufen werden? Geben Sie die Namen bitte im Format <Klassenname.Methodenname> an.
Ein Tipp zur Lösung: Wenn Sie mit dem Fragment „auf dem Trockenen“ nicht zurechtkommen, bauen Sie es einfach in eines der „Bären“-Programme aus dem Studienheft ein.
5. Sie wollen eine Klasse Vogel von der Klasse Haustiere ableiten. Die Klasse Haustiere verfügt lediglich über einen Konstruktor, der zwei int-Typen als Parameter verarbeitet. Was müssen Sie beim Konstruktor der Klasse Vogel in jedem
Fall berücksichtigen?
6. Sie haben folgende Basisklasse Insekt:
class Insekt
{
protected int laenge;
protected int gewicht;
//der Konstruktor
public Insekt(int laenge, int gewicht)
{
this.laenge = laenge;
this.gewicht = gewicht;
}
//die Methode zum Essen
public virtual void Essen()
{
laenge = laenge + 1;
gewicht = gewicht + 1;
}
//die Methode zur Ausgabe
public virtual void Ausgabe()
{
Console.WriteLine("Das Insekt ist {0} cm lang
und wiegt {1} Gramm.", laenge, gewicht);
}
}
Leiten Sie aus dieser Basisklasse eine Klasse Libelle ab. Die Klasse Libelle soll zusätzlich ein Feld fluegellaenge enthalten, das über einen Konstruktor mit einem beliebigen Wert initialisiert werden kann.
Die Methode Essen() der Klasse Libelle soll nicht nur das Gewicht und die Länge erhöhen, sondern auch die Flügellänge.
Ändern Sie auch die Methode Ausgabe() der Klasse Libelle so, dass zusätzlich die Flügellänge ausgegeben wird.
Stellen Sie in Ihrem Programm sicher, dass die Methoden in der Klasse Libelle die Methoden in der Klasse Insekt in jedem Fall überschreiben. Testen Sie Ihre neue Klasse, indem Sie eine Main()-Methode schreiben und in dieser je ein Objekt der Basisklasse und der abgeleiteten Klasse erzeugen und jeweils
beide Methoden mindestens einmal aufrufen.