创建常规类

jas*_*son 2 grails groovy

我正在尝试学习如何创建不是域类的简单Groovy类。我想在软件中创建一组类(及其对象),但无意保存到数据库中。具体来说,我有一个关于如何创建一个具有第二类列表属性的类的问题。像这样:

class oParent{
    def fName
    def lName
    def listOfChildren
}
class oChild{
    def propertyOne
    def propertyTwo
}
Run Code Online (Sandbox Code Playgroud)

因此,在此示例中,我可以创建每个这样的对象:

def p = new oParent();
def cOne = new oChild();
def cTwo = new oChild();

p.fName ="SomeName"
p.lName ="some Last Name"

cOne.propertyOne = "a"
cOne.propertyTwo = "b"

cTwo.propertyOne = "c"
cTwo.propertyTwo = "d"
Run Code Online (Sandbox Code Playgroud)

因此,如何将每个子对象(cOne和cTwo)添加到父对象p)。添加后,我将如何遍历父类的子级属性,例如,打印所有子类的所有propertyTwo属性?

tim*_*tes 5

这是代码的注释版本,其中包含一些更改建议:

// 1) Class names start with a Capital Letter
class Parent {

  // 2) If you know the type of something, use it rather than def
  String fName
  String lName

  // 3) better name and type
  List<Child> children = []

  // 4) A utility method for adding a child (as it is a standard operation)
  void addChild( Child c ) {
    children << c
  }

  // 5) A helper method so we can do `parent << child` as a shortcut
  Parent leftShift( Child c ) {
    addChild( c )
    this
  }

  // 6) Nice String representation of the object
  String toString() {
    "$fName, $lName $children"
  }
}

// See 1)
class Child{

  // See 2)
  String propertyOne
  String propertyTwo

  // See 6)
  String toString() {
    "($propertyOne $propertyTwo)"
  }
}

// Create the object and set its props in a single statement
Parent p = new Parent( fName: 'SomeName', lName:'some Last Name' )

// Same for the child objects
Child cOne = new Child( propertyOne: 'a', propertyTwo: 'b' )
Child cTwo = new Child( propertyOne: 'c', propertyTwo: 'd' )

// Add cOne and cTwo to p using the leftShift helper in (5) above
p << cOne << cTwo

// prints "SomeName, some Last Name [(a b), (c d)]"
println p
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

println p.children.propertyTwo // prints "[b, d]"
Run Code Online (Sandbox Code Playgroud)

或这个:

p.children.propertyTwo.each { println it } // prints b and d on separate lines
Run Code Online (Sandbox Code Playgroud)

或者,实际上是这样的:

p.children.each { println it.propertyTwo } // As above
Run Code Online (Sandbox Code Playgroud)