|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[Java] Pattern Decorator, non riesco a capire dove sia l'errore :-(
mmm...mi dà un errore che non riesco proprio a capire da cosa dipenda !!! Ci stò impazzendo.
L'esempio è il seguente: 1) Ho un'interfaccia Employee che è l'interfaccia comune e che rappresenta un generico impiegato e che serve a garantire la relazione di aggregazione 2) Ho la classe concreta Engineer che implementa l'interfaccia Employee: un ingegnere è un impiegato. 3) Ho la classe astratta ResponsibleWorker che implementa sempre l'interfaccia Employee e che mi servirà per definire i vari decoratori concreti della classe concreta Engineer 4) Ed ho due estensioni di ResponsibleWorker che mi servonoa decorare Engineer e che sono: AdministrativeManager e ProjectManager Il mio codice è il seguente: 1) Interfaccia Employee: Codice:
/* E' l'interfaccia comune che rappresenta un generico impiegato e serve a garantire la relazione di
* aggregazione tra oggetti concreti che rappresentano diversi tipologie di impiegati */
public interface Employee {
public String getName(); // Un generico oggetto impiegato deve saper ritornare il suo nome
public String getOffice(); // ritorna l'ufficio dove lavora l'impiegato
public void whoIs(); // Stampa chi è l'impiegato, dove lavora e la sua eventuale qualifica
}
Codice:
/* E' la classe concreta di base: un impiegato può essere un ingegnere */
public class Engineer implements Employee {
private String name; // nome dell'impiegato
private String office; // nome dell'ufficio dove lavora l'impiegato
/* Costruttore: riceve il nome dell'impiegato ed il nome dell'ufficio dove lavora e costruisce un
* nuovo oggetto di tipo Engineer */
public Engineer(String nam, String off){
name = nam;
office = off;
}
// Metodo che ritorna al chiamante il nome dell'impiegato:
public String getName(){
return name;
}
// Metodo che ritorna al chiamante il nome dell'ufficio dove lavora l'impiegato:
public String getOffice(){
return office;
}
// Metodo che stampa chi è l'impiegato e dove lavora:
public void whoIs(){
super.whoIs(); // Per prima cosa invoca il metodo whoIs del supertipo (se c'è)
// Poi stampa un messaggio personalizzato per quel particolare tipo di impiegato
System.out.println("Sono " + getName() + " e lavoro all'ufficio " + getOffice() + ".");
}
}
Codice:
/* Classe astratta che implementa l'interfaccia Employe e le cui estensioni rappresentano i vari
* decorator della classe concreta di base --> Engineer potrà essere decorato con diverse
* responsabilità rappresentate dalle estensioni di ResponsibleWorkere: AdministrativeManager e
* ProjectManager */
public abstract class ResponsibleWorker implements Employee {
protected Employee responsible; // Un impiegato è un generico responsabile
/* Costruttore: */
public ResponsibleWorker(Employee employee){
// Mette dentro la variabile responsabile il riferimento ad un generico impiegato
responsible = employee;
}
// IMPLEMENTAZIONE DEI METODI DICHIARATI NELL'INTERFACCIA Employee:
public String getName(){
// Invoca il metodo getName() sull'oggetto concreto referenziato da responsible
return responsible.getName();
}
public String getOffice(){
// Invoca il metodo getOffice() sull'oggetto concreto referenziato da responsible
return responsible.getOffice();
}
public void whoIs(){
// Invoca il metodo whoIs() sull'oggetto concreto referenziato da responsible
responsible.whoIs();
}
}
Codice:
/* Classe che estende la classe astratta ResponsibleWorker e che rappresenta un decoratore concreto per
* Engineer --> un Engineer può essere un Administrative manager ed avere determinate responsabilità */
public class AdministrativeManager extends ResponsibleWorker {
/* Costruttore: riceve il riferimento ad un generico impiegato e costruisce un oggetto di tipo
* Administrativemanager */
public AdministrativeManager(){
/* Invoca il costruttore del supertipo ResponsibleWorker che mette dentro la variabile
* responsible il riferimento ad un impiegato --> ora quell'impiegato è un responsabile */
super(empl);
}
// Implementazione del metodo whoIs() per un ProjectManager:
public void whoIs(){
sayIaBoss(); // Invoca il metodo sayIaBoss()
super.whoIs(); // Invoca il metodo whoIs del supertipo che stampa le info comuni
}
// Metodo private che stampa una stringa
private void sayIamBoss(){
System.out.println("I am a boss");
}
}
Codice:
/* Classe che estende la classe astratta ResponsibleWorker e che rappresenta un decoratore concreto per
* Engineer --> un Engineer può essere un Project Manager ed avere determinate responsabilità */
public class ProjectManager extends ResponsibleWorker{
private String Project; // Rappresenta il progetto diretto dall'ingegnere
/* Costruttore: riceve il riferimento ad un impiegato ed il nome del progetto da esso diretto e
* costruisce un nuovo oggetto di tipo Prooject Manager */
public ProjectManager(Employee empl, String proj){
/* Invoca il costruttore del supertipo ResponsibleWorker che mette dentro la variabile
* responsible il riferimento ad un impiegato --> ora quell'impiegato è un responsabile */
super(empl);
project = proj; // Copia la stringa ricevuta relativa al nome del progetto diretto
}
// Implementazione del metodo whoIs() per un ProjectManager:
public void whoIs(){
super whoIs(); // Per prima cosa invoca il metodo whoIs del supertipo che stampa le info comuni
// Poi stampa un secondo messaggio personalizzato relativo solo ai Project Manager
System.out.println("Gestisco il progetto: " + project);
}
}
Codice:
/* Classe di test che contiene il metodo main() */
public class Application {
public static void main(String[] args){
// Creo un impiegato come generico ingegnere e lo assegno ad un certo dipartimento:
Employee thisWillBeFamous = new Engineer("Luca Rocchi", "Dipartimento Sviluppo");
System.out.println("Who are you?");
thisWillBeFamous.whoIs();
// Lo decoro con la qualifica di Project Manager:
thisWillBeFamous = new ProjectManager(thisWillBeFamous, "D.O.S. - Doors Operating System");
System.out.println("Who are you?");
thisWillBeFamous.whoIs();
// LGli assegno una nuova qualifica di Project Manager:
thisWillBeFamous = new ProjectManager(thisWillBeFamous, "qualifica 2");
System.out.println("Who are you?");
thisWillBeFamous.whoIs();
}
}
Codice:
Description Resource Path Location Type Employee cannot be resolved to a type Application.java /Decorator1/src line 8 Java Problem Codice:
// Creo un impiegato come generico ingegnere e lo assegno ad un certo dipartimento:
Employee thisWillBeFamous = new Engineer("Luca Rocchi", "Dipartimento Sviluppo");
Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
controlla gli import.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
se Employee non viene risolto.......
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
posta la struttura di directory utilizzata.
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2007
Città: Milano
Messaggi: 413
|
Secondo me nella classe nel metodo whoIs della classe Engineer non ci vuole la chiamata super.whoIs().
Se fosse un import secondo me darebbe un errore di compilazione. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
presumo abbia tolto quella riga, altrimenti otterrebbe un ulteriore errore di compilazione (come lo è quello riportato), in quanto il metodo non è presente in Object.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:44.




















