Ereditari proprietà da una classe astratta e ordinamento di una raccolta su una proprietà di Abstact

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

  •  19-09-2019
  •  | 
  •  

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.

È stato utile?

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")
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top