从抽象类继承属性,并在抽象属性上对集合进行排序

时间:2010-02-09 13:59:45

标签: oop grails groovy abstract

我正在使用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 个答案:

答案 0 :(得分: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")
    }
}
相关问题