在Groovy中扩展类和实现trait有什么区别?

在Groovy中扩展类和实现trait有什么区别?,groovy,traits,Groovy,Traits,我刚刚开始使用Groovy,我正在尝试使用traits。下面我粘贴了一个学习练习,这些练习在我开始学习Java时非常有用,所以我也在使用Groovy的。我完成了这门课,然后想,为什么我不扩展一个类而不是使用一个trait呢?我很困惑,如果有人能帮忙,在Groovy中扩展类和实现特性有什么区别? class HowOldAreYou implements AskingAndAnswering { /** * * @param args */ sta

我刚刚开始使用Groovy,我正在尝试使用traits。下面我粘贴了一个学习练习,这些练习在我开始学习Java时非常有用,所以我也在使用Groovy的。我完成了这门课,然后想,为什么我不扩展一个类而不是使用一个trait呢?我很困惑,如果有人能帮忙,在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"}
    }
}
类如何实现询问和回答{
/**
*
*@param args
*/
静态空隙干管(args){
def name=AskName()
def age=AskAge(名称)
如果(年龄<16岁)结果“您还不能驾驶$name”
如果(年龄<18岁)结果“您还不能投票$name”
如果(年龄<25岁)结果“你还不能租车$name”
否则,如果(年龄>25岁)结果是“你可以做任何合法的$name”
否则结果“这是一个不寻常的年龄$name!”
}
/**
*
*/
特质询问与回答{
静态def键盘=新扫描仪(System.in)
静态字符串AskName(){
println“你叫什么名字?”
def name=keyboard.next()
}
静态int AskAge(名称){
println“\nOk,$name你多大了?”
int age=keyboard.nextInt()
}
静态无效结果(应答){println“\n$answer”}
}
}

根据规则,您只能扩展一个类。对于traits,您使用“implements”,类似于接口。你“实现”的特征数量没有限制

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


此行为与提供“多重交互”非常相似,因为您可以有效地“扩展”具有多个特性的类的行为,这些特性的行为可以类似于基类。

特性不是Groovy特有的。它是面向对象编程“理论”中的一个概念,很多语言都实现了这个概念

从理论上讲,一种特质并不是一种阶级。它并不代表“一件事”,而是一种“能力”或“行为”。它是一组提供能力的方法和状态

这个功能可以应用于一个类(“一件事”),一个类可以有多个功能(可以使用多个特性)

在Groovy中,类和trait之间的主要实际区别(当然还有trait和类之间冲突的解决),但更重要的是考虑trait的概念,即它的技术实现

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