java: come definire le capacità di un'istanza di sottoclasse che può essere derivata dalla superclasse

StackOverflow https://stackoverflow.com/questions/5822358

  •  26-10-2019
  •  | 
  •  

Domanda

Per rendere la mia domanda più concreto, mi permetta di pongo come un problema:

Descrizione situazione:

Abbiamo 3 concetti astratti:

Boss:  which has a number of employees
Worker:  that can execute some types of tasks
Task:  contains the semantics needed for a worker to execute it

Per l'attuazione / sottotipi abbiamo un certo numero di diversi tipi di lavoratori e diversi tipi di attività. Un tipo specifico di lavoratori in grado di eseguire alcuni tipi di attività (sottoinsieme di tutti i tipi)

problema da risolvere

Ora il boss ha un compito di tipo noto che desidera vedere eseguito, non conosce i tipi di lavoratori che ha (solo abstract tipo / interfaccia). Che tipo di interfaccia (s) potrebbe implementare il lavoratore / cosa potrebbe fare il boss per scoprire?

modi per risolverlo che mi viene in mente

Ho trovato questo in due modi, ma probabilmente ci sono altre e migliori modi:

1) facciamo una classe per ogni tipo di task implementando l'interfaccia azione vuota dare al lavoratore un eseguire la funzione (task): nella realizzazione di esecuzione (task) cercare di TYPECHECK / compito cast tutti tasktypes quel tipo di lavoratore può eseguire. Se nessuno dei typechecks passano, gettiamo un taskNotSupportedException. il capo può ora dare i compiti ai lavoratori fino a quando viene lanciata non fa eccezione.

2) che ora non abbiamo classi di attività, ma definire un'interfaccia capacità per ogni tipo di operazione con la funzione dotaskType (TaskInfo) un'implementazione lavoratore può ora implementare le interfacce capacità dipendenti di ciò che le sue capacità sono. il boss ora può controllare fino a trovare un operaio con la capacità adeguata (typechecking) e poi dargli l'incarico sapendo che possa eseguire il programma.

non ho la prova 2 e non ho molta esperienza in Java, ma questo dovrebbe essere possibile (o qualcosa di molto simile).

Ho anche preferisco 2 su 1, perché 1 sembra improprio (cascata di calchi) e le interfacce sono un modo naturale per definire ciò che un'istanza di una classe può fare, anche con le interfacce si poteva funzionalità di gruppo / creare gerarchie. (Anche nel mio attuale implementazione (1) l'interfaccia compito è vuota, quindi le attività non hanno molto in comune e le informazioni viene passato attraverso il costruttore (che sarebbe parametri delle funzioni in metodo 2) e recuperati dai ottiene.

mi chiedevo in quale altro modo si dovrebbe / potrebbe implementare (regolazione 1 o 2?) Questo o quale dei due preferisci e perché. (Efficienza non è importante, la modulazione / astrazione / manutenibilità è!)

È stato utile?

Soluzione

Non usare eccezioni per questo. Le eccezioni dovrebbero essere usati per situazioni eccezionali, e di non essere in grado di svolgere un compito sembra essere normale.

Vorrei aggiungere un metodo

boolean isAbleToExecute(Task task)

nella classe dei lavoratori, e hanno il capo iterata attraverso i suoi lavoratori e trovare un lavoratore in grado di eseguire l'operazione prima di assegnarlo.

Altri suggerimenti

interfaccia lavoratore potrebbe includere un metodo supportedTasks ritorno un elenco di attività. Poi si potrebbe mantenere una mappa, compito mappatura alla lista dei lavoratori che sostengono questo compito. Allora il tuo capo non ha bisogno di iterare, ma può semplicemente guardare in alto tutti i lavoratori che supportano un determinato compito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top