Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Eine Klasse zwingen, ein Interface zu implementieren, auch wenn eine der Oberklassen es bereits implementiert hat.

24 views
Skip to first unread message

jpr1965

unread,
Feb 16, 2012, 12:34:38 PM2/16/12
to
Hallo,

dies ist mal ein sehr spezielles Problem, aber ich kann das leider
nicht anders umsetzen (denke ich).

Ich habe mehrere Hierarchie-Bäume von Klassen, von denen sich einige
entsprechen. Und aus jeder Hiearchie darf ich nur die zusammenstecken,
die auch zusammenpassen.

Daher möchte ich erzwingen, dass die Klasse selbst die Schnittstelle
"IFahrzeugtyp" und damit eine virtuelle Methode "Fahrzeugtyp GetFahrzeugtyp()"
implementiert.

Beispiel:
1. Auto, Lkw, Pkw, Motorrad.
2. Autoreifen, Pkwreifen, Lkwreifen, Motorradreifen.

Ich muss jetzt verhindern, dass ein Lkwreifen an einen Pkw montiert wird:

In der Klasse Auto gibt es die Methode

MontiereReifen(Ort wo, Autoreifen autoreifen);

Da kann ich jetzt jeden Reifen reinstecken, und dann
fährt das Auto später eventuell nicht.

Und das merkt man erst zur Laufzeit.

Die Prüfung stelle ich mir so vor:

Jede Klasse weiß, zu welchem Fahrzeugtyp sie gehört:

enum Fahrzeugtyp { Auto, Lkw, Pkw, Motorrad };

IFahrzeugtyp { Fahrzeugtyp GetFahrzeugtyp() };

class Auto: IFahrzeugtyp { ... }
class Lkw : Auto, IFahrzeugtyp { ... }
class Pkw : Auto, IFahrzeugtyp { ... }
class Motorrad : Auto, IFahrzeugtyp { ... }
...
class Autoreifen : IFahrzeugtyp { ... }
class Pkwreifen : Autoreifen, IFahrzeugtyp { ... }
class Lkwreifen : Autoreifen, IFahrzeugtyp { ... }
class Motorradreifen : Autoreifen, IFahrzeugtyp { ... }

Das Problem ist nun,

wenn ich in Auto und Autoreifen die Methode

public virtual Fahrzeugtyp GetFahrzeugtyp() { return Fahrzeugtyp.Auto }

bereits implementiert habe, erhalte ich keine Fehlermeldung des Compilers,
falls z.B. Lkw diese Methode nicht implementiert.

Implementiere ich die Methode in keiner der Klassen

Lkw, Pkw, Motorrad, Pkwreifen, Lkwreifen, Motorradreifen

Liefert der Aufruf von GetFahrzeugtyp() immer "Fahrzeugtyp.Auto" zurück.
Damit schlägt die Prüfung nicht an, wenn ich im Pkw sicherstellen will,
dass nur Pkwreifen angebaut werden.

Sind die Methoden implementiert, erhalte ich im Pkw "Fahrzeugtyp.Pkw" und
für den Lkwreifen "Fahrzeugtyp.Lkw", und dann kann der Pkw erkennen,
dass der Reifentyp nicht passt.

Hoffentlich versteht das jemand...

VG

Ralf Peine
0 new messages