在Groovy中扩展类和实现trait有什么区别?
我刚刚开始使用Groovy,我正在尝试使用traits。下面我粘贴了一个学习练习,这些练习在我开始学习Java时非常有用,所以我也在使用Groovy的。我完成了这门课,然后想,为什么我不扩展一个类而不是使用一个trait呢?我很困惑,如果有人能帮忙,在Groovy中扩展类和实现特性有什么区别?在Groovy中扩展类和实现trait有什么区别?,groovy,traits,Groovy,Traits,我刚刚开始使用Groovy,我正在尝试使用traits。下面我粘贴了一个学习练习,这些练习在我开始学习Java时非常有用,所以我也在使用Groovy的。我完成了这门课,然后想,为什么我不扩展一个类而不是使用一个trait呢?我很困惑,如果有人能帮忙,在Groovy中扩展类和实现特性有什么区别? class HowOldAreYou implements AskingAndAnswering { /** * * @param args */ sta
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的概念,即它的技术实现 所以,是的,如果你只有一个特征,你可以使用一个抽象类,但是你应该记住你的特征是什么