Ja genau - oder?
je mehr Beispiele Du verwendest, umso komplizierter wird es 
Das habe ich befürchtet… O.o
Du willst also ein Objekt aus verschiedenen Sichtweisen
betrachten? Dann arbeite mit Interfaces:
Jajajajajaaaa genau darum habe ich das ja auch gesagt und gefragt ob es eine schlaue Möglichkeit gibt, rauszufinden aus welchem Interface das Objekt gerade bearbeitet (betrachtet) wird.
Und zusätzlich interessiert mich halt, ob es eine schlaue Möglichkeit gibt, mit einer interfacebedingten Überschreibung zu arbeiten ohne dass man eine einzige riesige Klasse mit sowas fabriziert:
public String toString()
{ switch (jetzigesInterfacee.equals(A))
case "A": {toString\_A();}
...
case "X": {toString\_X();}}}
private String toString\_A()
{ return "Das ist gerade Interface A"; }
private String toString\_B()
{ return "Wichtig ist für B "+$meineString; }
Aber dafür habe ich mittlerweile auch eine Lösung, und die wäre dass ich für jedes Interface hinter die Basisklasse noch eine abstrakte Klasse schalte, welche die Methoden des jeweiligen Interfaces enthält, dann brauche ich außer den tollen Case-Statements eigentlich keine „Unübersichtlichmachung“ der Basisklasse.
Wobei mich halt gewundert hat, dass Serviceprogrammierung in Java so kompliziert ist, in Shell ist das viel einfacher O.o
Vielleicht ist das ja, was Du suchst? Falls nicht, empfehle ich konkreter zu werden statt mit Beispielen zu verkomplizieren.
Konkret ist das, was ich in Shell machen würde:
##---SchuelerSicht
function bemalen{ echo $@ \>Laptop/Aussentext }
function nachlesen { echo "Da steht dran: `cat Kulitext`" }
##---InformatikerSicht
function programmStarten{ $1 }
function dateiSchreiben { echo $@ \>\> Laptop/infos.txt }
function nachlesen { cat Laptop/infos.txt }
##---Laptop
useFile="Datei";
groesse="15.4 Zoll";
function etwasSchreiben { cat \> Laptop/$useFile }
function nachlesen { cat $1 }
##---Objektnutzung
. Laptop.sh
function nutzeAls{
Sichtweise=$1;
$Sichtweise;
shift;
$@}
function nutze { $@ }
while ( read Zeile ) { $@ }
-
Das Objekt selbst hat also gewisse Attribute, welche in jeder Sicht erhalten bleiben und Funktionen, welche für alle Sichten verfügbar sind (aber je nach Sicht eine andere Bedeutung haben können).
-
Durch bestimmte Sichten (Nutzungsweisen) können neue Attribute des Objekts hinzu kommen.
-
Die Anzahl der möglichen Sichten und Attribute ist hier vom Objekt selbst nicht eingeschränkt. Eigentlich ist das Objekt sogar so „dumm“ dass es gar nicht wissen kann, was man mit ihm alles anstellen können will und trotzdem ist es möglich (auf der Wand steht ja auch nicht drauf, dass man da Nägel einklopfen kann)
-
Je nach Bedarf können hier spontan Sichten gewechselt, hinzugefügt oder entzogen werden, was mögliche Handlungen, nicht jedoch die Attribute, welche sie modifiziert haben, beeinfusst.
-
Das, was die einzelnen Sichten mit dem Objekt selbst anstellen ist nicht eingeschränkt durch das, was in der „Klassendefinition“ selbst als Code festgelegt ist.
-
Alles, was die Sichten tun, beeinflusst tatsächliche Attribute des Objekts.
Und sowas, wenn ich es jetzt richtig verstanden habe, geht in Java gar nicht und habe deswegen jetzt den Ansatz, nur über Interfaces plus abstrakte Klassen zu basteln, welche im Basisobjekt alle schon erweitert sein müssen, also:
So sieht mein Ansatz jetzt KONKRET aus:
abstract class Core
{
protected Vector Attribute;
public void deleteAttribute() { ... }
public void addAttribute(String, Object) { ... }
public Object readAttribute(String) { ... }
public void modifyAttribute(String, Object) { ... }
}
abstract class SchuelerArbeit extends Core
{
void bekritzeln(String X)
{ this.addAttribute("Aussentext",X); }
protected toString\_Schueler() { ... }
}
class Laptop extends SchuelerArbeit, AbiArbeit, StudiArbeit implements SchuelerSicht, AbiSicht, StudentenSicht
{
public toString()
{ switch (this.Interface) {
case "Schueler": { return toString\_Schueler(); }
case "Abiturient": { return toString\_Abiturient(); }
case "Student": { return toString\_Student(); } }
}
}
interface SchuelerSicht {
public toString;
public bekritzeln; }
interface AbiSicht {
public toString;
public schreiben; }
interface StudentenSicht {
public toString;
public schreiben; }
Gruß,
Michael