0

我正在使用 Grails 创建发票管理应用程序,并且遇到继承问题。

如果我的意图是每张发票都应包含一组行/项目,并且当发票格式化为打印时,项目按日期排序,按类别分成列表,然后以不同的方式计算每行的价格每种具体类型的方式(定时项目将在 rate 属性中查找每小时,定价项目在创建时分配一个价格)。

Node Invoice 有一个属性“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 行。

4

1 回答 1

1

您使用的枚举错误。enum 关键字类似于 class 关键字。所以当你定义你的枚举类型时,你从来没有给你的类一个它的实例。虽然您可以将枚举的定义留在抽象 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")
    }
}
于 2010-02-09T19:34:57.870 回答