Наследование свойств из абстрактного класса и сортировка коллекции по абстрактному свойству - PullRequest
0 голосов
/ 09 февраля 2010

Я создаю приложение для управления счетами с использованием Grails и испытываю проблемы с наследованием.

Если я намерен, чтобы каждый счет-фактура содержал коллекцию строк / элементов и чтобы при форматировании счета-фактуры для печати элементы сортировались по дате, разделялись на списки по категориям, а затем рассчитывалась цена каждой строки. по-разному для каждого конкретного типа (временные элементы будут проверяться ежечасно в свойстве тарифов, ценовым элементам назначается цена при создании).

Узел-счет-фактура имеет свойство "items", представляющее собой коллекцию объектов Item.

Источник классов моего домена:

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
}

Источник проблемного кода:

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

Сообщение об ошибке:
groovy.lang.MissingPropertyException: Нет такого свойства: категория для класса: TimedItem

Stacktrace указывает 6-ю строку приведенного выше примера.

1 Ответ

1 голос
/ 09 февраля 2010

Вы используете enum неправильно. Ключевое слово enum похоже на ключевое слово class. Поэтому, пока вы определили свой тип enum, вы никогда не давали своему классу его экземпляр. Хотя вы можете оставить определение перечисления внутри абстрактного класса Item, для ясности я переместил его наружу.

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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...