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