Ereditari proprietà da una classe astratta e ordinamento di una raccolta su una proprietà di Abstact
Domanda
Sto creando un'applicazione di gestione della fattura usando Grails e sto riscontrando problemi con l'eredità.
Se la mia intenzione è che ogni fattura debba contenere una raccolta di linee/elementi e che quando la fattura è formattata per la stampa, gli elementi vengono ordinati per data, separati in elenchi per categoria, quindi avere il prezzo di ciascuna riga calcolata in un diverso Il modo per ogni tipo di cemento (gli articoli a tempo cercheranno ogni ora nella proprietà delle tariffe, agli articoli a prezzo viene assegnato un prezzo alla creazione).
Node fattura ha una proprietà "elementi", che è una raccolta di oggetti oggetti.
Fonte delle mie lezioni di dominio:
class Invoice {
static constraints = {
}
String client
Date dateCreated
Date lastUpdated
CostProfile rates
def relatesToMany = [items : Item]
Set items = new HashSet()
}
abstract class Item{
static constraints = {
}
String description
Date date
enum category {SERVICE,GOODS,OTHER}
def belongsTo = Invoice
Invoice invoice
}
class TimedItem extends Item{
static constraints = {
}
int minutes
}
class PricedItem extends Item{
static constraints = {
}
BigDecimal cost
BigDecimal taxrate
}
Fonte del codice problematico:
invoiceInstance.items.add(new TimedItem(description:"waffle", minutes:60, date:new Date(),category:"OTHER"))
def firstList = []
def lastList = []
invoiceInstance.items.sort{it.date}
invoiceInstance.items.each(){
switch(((Item)it).category){
case "LETTER":
firstList.add(it)
break;
default:
lastList.add(it)
}
}
Messaggio di errore:
groovy.lang.MissingPropertyException: nessuna proprietà di questo tipo: categoria per la classe: timeditem
StackTrace indica la sesta riga dell'esempio sopra.
Soluzione
Stai usando Enum Wrong. La parola chiave Enum è simile alla parola chiave di classe. Quindi, mentre hai definito il tuo tipo ENUM, non hai mai dato un'istanza alla tua classe. Mentre potevi lasciare la definizione dell'Enum all'interno della classe Abstract Elem, l'ho spostato fuori per chiarezza.
class Invoice {
Set items = new HashSet()
}
enum ItemCategory {SERVICE,GOODS,OTHER}
abstract class Item{
String description
ItemCategory category
}
class TimedItem extends Item{
int minutes
}
def invoice = new Invoice()
invoice.items.add(new TimedItem(description:"waffle", minutes:60, category: ItemCategory.OTHER))
invoice.items.each(){
switch(it.category){
case ItemCategory.OTHER:
println("Other found")
break
default:
println("Default")
}
}