2016-09-06 1 views
0

Ich möchte Smart Devices Welt zu simulieren. Mein Plan war, eine Hierarchie wie diese zu erstellen.Wie erzwingen Unterklassen, um eine Methode zu implementieren, die einen bestimmten Typ akzeptiert

Smart Device als meine Hauptschnittstelle. Telefon und Watch als Klassen, die Smart Device implementieren. und Samsung und Apple als Klassen, die Telefon erweitern.

und schließlich habe ich zwei Klassen namens ios und android, die eine Oberklasse namens Os erweitern.

Ich möchte die Fähigkeit haben, Apple und Samsung zu zwingen, ihre eigenen entsprechenden Os zu installieren, während ich die Installation von Os auf jedem Gerät (wie Uhr) erzwingen, die SmartDevice implementiert.

Daher habe ich eine Methode namens istallOs (Os test) in meiner Schnittstelle erstellt, aber das Problem ist, dass ich diese Methode nicht in Telefonebene implementieren kann, weil ich nicht weiß, ob es Samsung oder Apple ist.

Ich rate meine Hierarchie ist nicht für dieses Problem geeignet und ich sollte InstallOs auf eine niedrigere Ebene verschieben.

Was ist die Lösung für dieses Problem? Wenn Sie beschränkte Typen und ein Beispiel in Ihre Lösung einschließen können, wäre das großartig.

public interface SmartDevice<T extends Os> { 

    public Boolean installOs(T os); 
} 

public abstract class Phone implements SmartDevice<T extends Os>{ 

@Override 
public Boolean installOs(T t) { 
    //Cant implement it here since I dont know what device i am dealing with 
} 
} 

public class ApplePhone extends Phone<ios> { 

@Override 
public Boolean installOs(ios os) { 
    //this is an Apple phone so its ok to install ios in it. 

    System.out.println("Installing Os: "+os.getName()); 
    return true; 
} 
} 
+0

Es klingt wie der Fehler versucht, 'installOs' als eine konkrete Methode in' Phone' zu ​​implementieren. Warum nicht einfach abstrakt bleiben? –

+0

Sie können 'Phone' auch mit' T' parametrieren: 'class Telefon implementiert SmartDevice {0} –

+0

Da OSs wahrscheinlich global gleich sein sollten, sollten Sie sie als Singleton verwenden und a zuweisen spezifisches Betriebssystem von diesem Singleton (eq: a Set ) zu einem SmartDevice. –

Antwort

0

Ich habe gerade herausgefunden, dass ich eine abstrakte Methode in meine Schnittstelle einfügen konnte!

so alles, was ich die ganze Zeit brauchte, war

public interface SmartDevice<T extends Os> { 
    public abstract Boolean installOs(T os); 
} 

Dann habe ich zum Telefon Klasse ging und verändert beschränkten Typen dazu:

public abstract class Phone<A extends Os> implements SmartDevice<A>{ 

@Override 
public abstract Boolean installOs(A s) ; 

} 

Vielen Dank für Ihre Hilfe Jungs.

Verwandte Themen