在Groovy中扩展类和实现特征之间的区别是什么?

时间:2016-03-12 03:01:52

标签: groovy traits

我刚开始使用Groovy,我正在尝试使用特征。下面我粘贴了www.programmingbydoing.com的学习练习,当我开始学习Java时,这些练习非常有用,所以我也使用了Groovy。我完成了这个课然后想,为什么我不扩展一个类而不是使用特征?如果有人能提供帮助,我很难过,在Groovy中扩展课程和实现特质之间的区别是什么?

  class HowOldAreYou implements AskingAndAnswering {
    /**
     *
     * @param args
     */
    static void main(args) {
        def name = AskName()
        def age = AskAge(name)
        if (age < 16)       result "You can't drive yet $name"
        if (age < 18)       result "You can't vote yet $name"
        if (age < 25)       result "You can't rent a car yet $name"
        else if (age > 25)  result "You can do anything that is legal $name"
        else                result "That's an unusual age $name!"
    }
    /**
     *
     */
    trait AskingAndAnswering {
        static def keyboard = new Scanner(System.in)
        static String AskName() {
            println "What is your name?"
            def name = keyboard.next()
        }
        static int AskAge(name) {
            println "\nOk, $name How old are you?"
            int age = keyboard.nextInt()
        }
        static void result(answer) {println "\n $answer"}
    }
}

2 个答案:

答案 0 :(得分:0)

按规则,您只能扩展一个班级。使用traits,你可以使用`implements',类似于接口。你的'实施'的特征数量没有限制。

但是特性与界面不同,因为它包含完全实现的方法。 结果与组合非常相似,您可以根据需要通过简单地实现可重用的特征向现有类添加功能。

这种行为与提供“多重干扰”非常相似,因为您可以有效地“扩展”具有多个特征的类的行为,这可以类似于基类。

答案 1 :(得分:0)

Trait并非特定于Groovy。它是面向对象编程中的一个概念&#34;理论&#34;,很多语言实现了这个概念。

&#34;理论上&#34;,特质不是一个阶级。它并不代表&#34;事物&#34;,而是更多的&#34;能力&#34;或者&#34;行为&#34;。它是一组提供能力的方法和状态。

此功能可以应用于类(&#34; a&#34;),类可以具有多种功能(可以使用多种特性)。

在Groovy中,它是阶级和特质之间的主要实际差异(当然还有特征和阶级之间冲突的解决),但考虑特征的概念更为重要,它的技术实施。

所以,是的,如果你只有一个特质,你可以使用抽象类,但你应该记住你的特质是什么。