我正在使用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行。
答案 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")
}
}