OOP Problem
Andi
- programmiertechnik
Hallo,
folgendes Problem:
Ich bekomme über einen Webservice eine ID. Diese ID entspricht einem Mitarbeiter.
zZ haben wir 3 Mitarbeitertypen: Designer, Sekretärin, Putzfrau
Nun möchte ich ein Interface definieren, welches mir sagt, dass diese 3 Objekte alle einen Name besitzen und auch neue Objekte dieser Art auch alle einen Namen besitzen sollen.
Weiters möchte ich jetzt nur dem Konstruktor die ID übergeben und dann die entsprechenden Methoden aufrufen ca. so:
Mitarbeiter m = new Mitarbeiter(ID);
m.getName();
Der Konstruktor sucht diese ID in einer DB (3 Tabellen) und gibt mir dann füllt dann sein Objekt.
Nun habe ich aber ein weiters Problem. Wenn jetzt z.b. ein Objekt eine Sonderaufgabe hat z.b. die Putzfrau bekommt die Funktion klaueGoldbarren().
Dann wird diese Sache nicht mehr funktionieren:
Mitarbeiter m = new Mitarbeiter(ID);
m.klaueGoldbarren();
Der Designer und die Sekretärin haben diese Funktion leider nicht.
Könnt ihr mir einen Denkanstoß geben oder eine Objektidee. Ich weiß leider nicht mehr weiter ohne, dass ich die Blöde abfrage mache und dann die Objekte erste anlegen, dass muss doch irgendwie einfacher auch zu bewerkstelligen sein.
Grüße
Andi
Hallo Andi,
Teil 1: Definiere eine Oberklasse Mitarbeiter (php4: class, php5 abstract class oder vielleicht auch interface)
Teil 2: Definiere für die verschiedenen Mitarbeiter Unterklassen Designer, Putzfrau etc. (extends)
Teil 3: Definiere eine Klasse, die die verschiedenen Mitarbeiter erzeugt
Pseudocode:
class MitarbeiterFabrik {
public static function erzeuge($id) {
if ($id is Putzfrau) {
return new Putzfrau($id)
} elseif ($id is Designer) {
return new Designer($id)
} else {
return ErrorCode or throw exception
}
}
}
$mitarbeiter = MitarbeiterFabrik::erzeuge(12345);
Gruß
Olaf
Hi,
nur mal ins Blaue gestochert: Dein Interface (wobei ich mir nicht ganz sicher bin, was du mit einem interface willst, du könntest auch einfach nur eine Klasse "Mitarbeiter" oder eine abstrakte Basisklasse haben) könnte so aussehen:
interface IMitarbeiter
{
string Name { get; }
bool CanExecuteOperation(Operations opToExecute);
void ExecuteOperation(Operations opToExecute);
}
enum Operations
{
raeumeAuf, klaueGeld, voegeleDenHausherrn, leereDenKuehlschrank // ... usw
}
Du möchtest aber vielleicht den Mitarbeiter mittels einer Factory (~methode) erzeugen, die dann ein Objekt produziert, was das Interface IMitarbeiter implemeniert:
IMitarbeiter obj = GenericMitarbeiter.Create(mitarbeiterId);
obj.ExecuteOperation(Operations.klaueGeld);
Wenn du mit Interfaces arbeitest, dann solltest du versuchen Konstruktoren, die Argumente verlangen zu vermeiden. Eine Konstruktor-Signatur kannst du imho nicht in einem Interface unterbringen .. kann mich aber auch irren.
Nun habe ich aber ein weiters Problem.
Wo war das erste Problem?
Ciao, Frank
Dann wird diese Sache nicht mehr funktionieren:
Mitarbeiter m = new Mitarbeiter(ID);
m.klaueGoldbarren();
Unsere Wenigkeit würde ganz schlicht eine Fehlerbehandlung erwarten, wenn die Methode nicht bereitsteht, die zur Laufzeit wirkt.
Was bringt es eigentlich eine Klasse Mitarbeiter hochkommen zu lassen, wenn diese sich dermassen unterschieden, dass Unterklassen wie Mitarbeiter.Räuber oder Mitarbeiter.Polizist von uns als zugegebenermassen Nicht-OO-Experten erwartet würden?