# Kovariante Anpassung



## jovo (16. Sep 2014)

Hallo Community  ,

Unsere Lehrerin hat uns ein paar Aussagen gegeben und wir sollten entscheiden, ob diese wahr sind oder falsch sind.
Hierbei hätten wir ein Problem: 
"Eine Redeklaration durch eine kovariante Anpassung eines Parametertyps verhindert ein Subtyp-Verhältnis". 

Wir wissen, dass eine Redeklaration eine Veränderung des Parameter- oder Ergebnistyps ist. Dabei sei eine kovariante Anpassung des Ergebnistyps und eine kontravariante Anpassung des Parametertyps typsicher. Somit wäre die Redeklaration der Methode, die durch die Aussage entsteht, nicht typsicher. Heißt das aber auch, dass es ein Subtyp-Verhältnis verhindert? Was heißt denn eigentlich Subtyp-Verhältnis ? (Bei google unter dem Begriff nichts nennenwertes gefunden). 

Falls ihr das wisst oder mir einen Link geben könntet, dass uns weiterhelfen könnte, immer her damit ,

Grüße jovo!


----------



## jovo (18. Sep 2014)

kann mir keiner helfen? also ich habe das ausprobiert und eine Subtyp-Beziehung besteht natürlich weiterhin. Aber Subtyp-Verhältnis? ....


----------



## AndiE (19. Sep 2014)

Bis jetzt weiß ich nicht, worum es geht. Für mich gibt es die Konzepte der OOP: Vererbung, Kapselung und Polymorphismus. Wie ist das Konzept der Kovarianz zu verstehen. Kannst du mal erklären, welche praktische Bedeutung das für die Programmierung hat, also in welchen Anwendungsfällen es eingesetzt wird.


----------



## jovo (19. Sep 2014)

Danke auf jeden Fall für deine Antwort!

Es gibt ja Interfaces, die ausschließlich aus Operationen und nicht aus Implementationen bestehen. Dabei gibt es ebenfalls eine Vererbung für Interfaces mit dem schlüsselwort extends ( so wie bei Klassenvererbung). Ein erbender Interface nennt man Subtyp und ein Interface ,der diese Operationen anbietet, nennen wir Supertypen. (anbietet hört sich falsch an, aber ich glaube ihr wisst was ich meine)

Wenn ich nun ein Interface habe wie beispielsweise:

```
/**
 * Hier liegt ein Beispiel für ein Supertypen vor, welches eine Methode hat, die man später Redeklarieren möchte
 * 
 * @author jovo
 */
public Interface Mensch
{

    public void essen(Nahrung nahrung);
}
```

Und anschließend ein Subtypen definiere und dabei die Methode redeklariere, weil es zu diesen Typen passt:


```
/**
 * Hier wird die Methode deklariert, weil ein Diabetiker nur Diabetikeressen essen darf.
 * 
 * @author jovo
 * @version 
 */
public class Diabetiker extends Mensch
{
    public void essen(Diabetikeressen dia);
}
```

Dann ist das eine kovariante(in Vererbungsrichtung, da Diabetikeressen von Nahrung erbt) Anpassung eines Parametertyps. Ich könnte anschließend dies machen:


```
Mensch person = new DiabetikerImpl();
Nahrung nahrung = new Nahrung();
person.essen(nahrung);//DA IST JA WAS FAUL !!! Person ist doch ein Diabetiker und darf spezifisch keine Nahrung mit viel Zucker essen???
```

Und anhand der Operation essen sieht ihr das es nicht typsicher ist. Etwas ist faul. Das wäre eine kovariante Anpassung eines Parametertyps, welches nicht typsicher ist!!! Hoffe die Frage ist nun ein wenig ersichtlicher geworden 

Grüße jovo!


----------

