PDA

View Full Version : [Java] Pattern Decorator, non riesco a capire dove sia l'errore :-(


e-commerce84
26-05-2010, 11:14
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:

/* 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

}


2) Classe Engineer:

/* 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() + ".");
}

}


3) Casse astratta ResponsibleWorker:

/* 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();
}

}


4) Estensioni di ResponsibleWorker:


/* 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");
}

}


e


/* 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);
}

}


5) Classe di test contenente il metodo main():

/* 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();

}

}


L'errore che mi dà è che nel main pare non riconoscere Employee come tipo:

Description Resource Path Location Type
Employee cannot be resolved to a type Application.java /Decorator1/src line 8 Java Problem


La riga dell'errore esattamente è questa:

// Creo un impiegato come generico ingegnere e lo assegno ad un certo dipartimento:
Employee thisWillBeFamous = new Engineer("Luca Rocchi", "Dipartimento Sviluppo");


Anche questo esempio è stato preso dalle slide del corso...cosa c'è che non funziona?

Grazie

nuovoUtente86
26-05-2010, 12:08
controlla gli import.

e-commerce84
26-05-2010, 12:12
controlla gli import.

import di cosa? :mc: :mc: :mc:

nuovoUtente86
26-05-2010, 12:25
se Employee non viene risolto.......

e-commerce84
26-05-2010, 12:33
se Employee non viene risolto.......

eh ma stanno nello stesso package...non ce ne dovrebbe essere bisogno !!!

nuovoUtente86
26-05-2010, 12:40
posta la struttura di directory utilizzata.

CwNd
26-05-2010, 15:44
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.

nuovoUtente86
26-05-2010, 16:20
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.

presumo abbia tolto quella riga, altrimenti otterrebbe un ulteriore errore di compilazione (come lo è quello riportato), in quanto il metodo non è presente in Object.