Vererbung - Typabfrage

Status
Nicht offen für weitere Antworten.

tobbworld

Mitglied
Hallo miteinander,

ich habe zur Zeit das Problem das ich gerne eine Fallunterscheidung für Betriebssysteme vornehmen möchte, sprich betriebssystemspezifische Eigenschaften setzen.

Vom logischen habe ich mir folgendes gedacht:

[highlight=Java]
Klasse OperationSystem
//beinhaltet Eigenschaften die alle BS gemeinsam haben



Klasse OperationSystemMac extends OperationSystem:
// Mac spezifische Eigenschaften

Klasse OperationSystemWindows extends OperationSystem:
//Windows spezifische Eigenschaften
[/highlight]


Und hier ist mein Problem:

In meinem Programm wollte ich ein "globales" OperationSystem-Objekt haben mit dem ich, je nach Betriebssystem, auf die Eigenschaften zugreifen kann.

Nur wie kann ich zur Laufzeit ein Objekt erzeugen mit dem ich auf die Eigenschaften des BS zugreifen kann ohne das ich immer, egal welches BS, ein Mac, Windowsobject etc. habe?

Sprich:
[highlight=Java]
OperationSystemMac osm;
OperationSystemWin owin;
OperationSystem os = new OperationSystem();

//Bsp Mac
if(os.getOperationSystem instanceof OperationSystemMac) {
osm = os.getOperationSystem();
}

Mit der oben beschriebenen Variante müsste ich ja nun im Programmcode immer abfragen:

if(osm != null) {
...
}
else if(owin != null) ....
[/highlight]

Wie kann ich vorgehen das ich in einem Objekt meine spezifiscehn Einstellungen für das Betriebssystem habe?
Sprich ein globales Objekt das mein Betriebssystem repräsentiert.
Ist der Weg über eine Schnittstelle, abstrakte Klasse evt. der richtige Weg?

Vielen Dank für eure Hilfe
Tobi
 
Zuletzt bearbeitet:

hdi

Top Contributor
Hm.. Ich weiss jetzt nicht welche Infos du sammeln willst, und inwiefern die sich unterscheiden.

Ich schätze das beste ist ein Interface (oder abstrakte Klasse, kommt aufs gleiche raus)
Das nennst du "OSBehaviour" und es stellt bestimmte Methoden zur Verfügung, und zwar
alle, die irgendwo in irgendwelchen Systemen vorkommen könnten.

Dann machst du dir davon implementierungen:

WinBehaviour implements OSBehaviour usw.

Du implementierst nur die Methoden die du brauchst für dieses OS und lässt die anderen
leer, oder gibst da Fehlermeldungen zurück whatever.

Deiner Klasse OperatingSystem gibts du jetzt lediglich eine Member-Variable von
diesem Interface ("OSBehaviour myBehaviour"), zB im Konstruktor gleich wenn du
weisst welches OS konkret verwendet wird.
Sowas ist besser als Vererbung/Implementierung und nennt sich "Komposition".

Ja...und dann rufst du überall nur die Methoden dieser OperatingSystem-Instanz auf,
die jetzt global ist, und Aufrufe an ihre Member-Variable delegiert, die eine konkrete
Implementierung irgendeines OS-Behaviours ist.

Jetzt musst du nur wissen wie du die Methoden kapselst, d.h. wie du allgemeine
Methoden in dem OperatingSystem-Objekt zur Verfügung stellen kannst, die dann
eben sinnvoll an ihr Behaviour delegieren.

... je nachdem wie stark unterschiedlich das Verhalten sein soll für je ein OS, musst du
dir das zusammenbiegen.

Die Idee hier wär aber eben dieses Verhalten:
Eine Klasse hat (und erbt nicht) ein Interface, beim Instantiieren gibst du ihr eine
konkrete Implementierung des Interfaces.
Die Klasse deligiert (leitet weiter) an ihr Interface-Objekt, und ohne zu wissen welche
konkrete Implementierung das nun ist (WinBehaviour, MacBehaviour usw), passiert entsprechendes, oder eben nicht.

Naja, ob das jetz so gut rüberkam?!

edit:
Mal n Bsp damit du siehst in welche Richtung es geht:

[HIGHLIGHT="Java"]interface SoundBehaviour{
public void makeSound();
}

class Animal{
private SoundBehaviour mySnd;

public Animal(SoundBehaviour mySnd){
this.mySnd = mySnd;
}

public void makeSound(){
mySnd.makeSound(); // Delegation
}
}

class DogSound implements SoundBehaviour{
@Override
public void makeSound(){
System.out.println("Wuff!");
}
}
class CatSound implements SoundBehaviour{
@Override
public void makeSound(){
System.out.println("Miau!");
}
}

// main Methode:
Animal[] animals = new Animal[2];
animals[0] = new Animal(new DogSound());
animals[1] = new Animal(new CatSound());

// Hier globaler Einsatz: Du weisst es ist n Tier, aber welches weisst du nicht
for(int i = 0;i<animals.length;i++){
animals.makeSound(); // aber es wird konkret reagiert
}[/HIGHLIGHT]
 
Zuletzt bearbeitet:

Illuvatar

Top Contributor
hdi hat gesagt.:
Sowas ist besser als Vererbung/Implementierung und nennt sich "Komposition".
Vielleicht sollte man auch erwähnen warum - weil das die Klassen weniger stark voneinander abhängig macht. Vererbung ist eine sehr starke Abhängigkeit.

Allerdings glaub ich, du erschlägst den armen tobbworld gerade ein bisschen - auch wenn du noch so recht hast. Aber angenommen man würde es so machen wollen, wie tobbworld es versucht - was ja auch nicht verkehrt ist, wenn auch eben nicht perfekt ;) - dann würde das so aussehen.

Als Beispiel für so eine OS-spezifische Eigenschaft verwende ich mal den file-separator. Bitte beachten: das ist nur zu Demonstrationszwecken, den kriegt man nämlich besser aus System.getProperty("file.separator").

[HIGHLIGHT="Java"]
public abstract class OperatingSystem
{
public abstract String getFileSeparator();
}
public class WinOS extends OperatingSystem
{
public String getFileSeparator()
{
return "\\";
}
}
public class UnixOS extends OperatingSystem
{
public String getFileSeparator()
{
return "/";
}
}

// Verwendung:

OperationSystem os;
if (/*windows*/) {
os = new WinOS();
} else if (/*unix*/) {
os = new UnixOS();
} else if (/*mac*/) {
throw new IDontLikeThisOSException(); // :bae:
} else {
throw new UnsupportedOSException();
}

// ...

String fileSeparator = os.getFileSeparator();
[/HIGHLIGHT]
 

didjitalist

Bekanntes Mitglied
würds wahrscheinlich mit ner factory methode machen
Code:
public abstract class OperationSystem
{
  public static OperationSystem getCurrentOS()
  {
     if( /* win */ )
        return new WinOS();
     if( /* OSX */ )
        return new MacOS();
     // etc.
  }
}
wenns "global" sein soll, kannst du die entsprechenden OS objekte auch einfach statisch vorhalten und immer dasselbe objekt zurückliefern.
 

tobbworld

Mitglied
Hallo,

erst einmal vielen Dank für die zahlreichen und vor allem hilfreichen Beiträge. Wenn will ich es diesmal richtig machen und habe mich für die Lösung von "hdi" entschieden ;D
Hat wunderbar funktioniert. Hier meine implementierte Lösung für alle die irgendwann einmal das selbe Problem haben sollten:

Main- Klasse:

[highlight=Java]
public static void main(String[] args) {

OperationSystem os = null;

// Fallunterscheidung Betriebssystem
String osName = System.getProperty("os.name").toLowerCase();
if(osName.startsWith("windows")) os = new OperationSystem(new WinBehavior());
if(osName.startsWith("mac os x")) os = new OperationSystem(new MacBehavior());

// Abrufen der systemspezifischen Eigenschaften
System.out.println("OS => " + os.getName());
System.out.println("Java => " + os.getJavaVersion());
}
[/highlight]

OperatingSystem Klasse:


[highlight=Java]
public class OperatingSystem {

private OSBehavior myOS;


public OperatingSystem(OSBehavior myOS) {
this.myOS = myOS;
}


public String getName() {
return myOS.getName();
}

public String getFileSeperator() {
return myOS.getFileSeperator();
}

// Methoden die für jedes OS gleich sind
public String getJavaVersion() {
return System.getProperty("java.version");
}


}
[/highlight]

OSBehavior Klasse (Schnittstelle):

[highlight=Java]
public interface OSBehavior {

public String getFileSeperator();

public String getName();

}
[/highlight]

WinBehavior Klasse:

[highlight=Java]
public class WinBehavior implements OSBehavior{

public WinBehavior() {

}

public String getFileSeperator() {
return "\\";
}

public String getName() {
return "Windows";
}
}
[/highlight]

MacBehavior Klasse:


[highlight=Java]
public class MacBehavior implements OSBehavior{

public MacBehavior() {

}

public String getName() {
return "MacOS";
}

public String getFileSeperator() {
throw new UnsupportedOperationException("Not supported yet.");
}

}
[/highlight]

Anmerkung: Den Fileseperator ziehe ich sonst auch aus den Systemproperties, Methode war jetzt nur für Demonstrationszwecke
 
M

maki

Gast
Wie wäre es mit einer Factory Methode welche gleich das passende Objekt zurückliefert?
 

tobbworld

Mitglied
Hey maki,

wie meinst du das genau? Wenn ich die Variante von didjitalist benutze muss ich doch in meinem Hauptprogramm immer noch unterscheiden mit welchen Objekt ich jetzt arbeite, oder nicht?
 
M

maki

Gast
Wenn ich die Variante von didjitalist benutze muss ich doch in meinem Hauptprogramm immer noch unterscheiden mit welchen Objekt ich jetzt arbeite, oder nicht?
Nö, wenn du digitalists Vorschlag folgst, musst du genau das nicht mehr machen und deine main Klasse würde kleiner werden ;)
 

hdi

Top Contributor
Ich weiss auch nich ob ich genau die Definition von Factory kenne, ich glaube er meint
aber einfach nur dass du den Code in der main, der das OS bestimmt, auslagerst
in eine Hilfsklasse:

OperationSystem os = OSFactory.getOS(); // in getOS() dann die Berechnungen vornehmen

vllt meint er das aber auch nicht.
 
M

maki

Gast
Ja HDI,genau das meinte digitalist und ich auch.

Es gibt mehrere Wege dafür, von statischen Factory Methoden bis hin zu Factory Klassen, wobei ersteres hier besser wäre.
 
Zuletzt bearbeitet von einem Moderator:

hdi

Top Contributor
Ja, aber alleine die Auslagerung des Codes ist nicht das, was man ein Factory Pattern nennt, denk ich.
Ist also hier vllt grad noch so eine Pseudo-Factory...
 
M

maki

Gast
Ja, aber alleine die Auslagerung des Codes ist nicht das, was man ein Factory Pattern nennt, denk ich.
Ist also hier vllt grad noch so eine Pseudo-Factory...
Keine Pseudo Factory!
Die Kapselung des Codes um ein Objekt zu erstellen ist genau das was eine Factory ausmacht ;)

Aufrufer müssen nun nicht mehr wissen was alles nötig ist um ein Objekt zu stellen.
Wenn man statt einer konkreten Implementierung ein Interface zurückgibt, weiss der Aufrufer nichtmal um welche Implementierung es sich handelt.
Ausserdem können Factories anders als Konstruktoren sprechende Namen haben.
Man kann Factories aber auch einsetzen wenn immer nur diesselbe Implementierung erzeugt wird, aber die Erzeugung des Objektes kompliziert/aufwändig ist oder um die Internas zu verstecken.
 

tobbworld

Mitglied
Keine Ahnung ob ich euch jetzt richtig verstanden habe:

Habe am Beispiel mit Interfaces hätte ich es jetzt so gelöst:

In der Main- Klasse:

[highlight=Java]
os = OperatingSystem.getOS();[/highlight]

Operating System:
[highlight=Java]
public class OperatingSystem {

private OSBehavior myOS;


public OperatingSystem(OSBehavior myOS) {
this.myOS = myOS;
}


public String getName() {
return myOS.getName();
}

public String getFileSeperator() {
return myOS.getFileSeperator();
}


public String getJavaVersion() {
return System.getProperty("java.version");
}


public static OperatingSystem getOS() {
// zum Test nur mal Windows....
return new OperatingSystem(new WinBehavior());
}

}
[/highlight]

Wenn ich den Vererbungs Ansatz verfolge würde es bei mir so aussehen:

[highlight=Java]
public abstract class OperatingSystem
{
public abstract String getFileSeparator();


public static OperatingSystem getCurrentOS()
{
if( /* win */ )
return new WinOS();
if( /* OSX */ )
return new MacOS();
// etc.
}
}
public class WinOS extends OperatingSystem
{
public String getFileSeparator()
{
return "\\";
}
}
public class UnixOS extends OperatingSystem
{
public String getFileSeparator()
{
return "/";
}
}

// Verwendung:

OperatingSystem os = OperatingSystem.getCurrentOS();

String fileSeparator = os.getFileSeparator();
[/highlight]

Meine Frage nun noch dazu, welcher Ansatz ist besser und performanter? Der über Interfaces oder über Vererbung?

Viele Grüße
Tobi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
G Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen


Oben