网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

Scala特质中如何实现?

GG网络技术分享 2026-01-23 08:17 2


哎哟喂, 今天咱们来聊聊Scala里的那个叫特质的东西,真的,有时候我dou想把键盘砸了。你知道吗?作为一个天天跟代码打交道的苦逼程序员,遇到这种既有接口又有抽象类的玩意儿,简直是在考验我的发际线。Scala特质中如何实现? 这个问题听起来简单,其实吧里面全是坑啊!我昨天晚上熬夜调代码就是为了搞懂这个混入到底是咋回事儿,来一波...。

这玩意儿到底是啥?

说实话,刚学的时候我是一脸懵逼。订阅专栏特质类似于Java中的接口,但即可定义抽象方法,也可定义具体方法. 听懂了吗?没听懂没关系,反正我也是似懂非懂的。你说说这语言设计者是怎么想的?弄个四不像出来折磨我们。一个类只Neng继承一个父类,但可混入多个特质,混入特质 可yi用extends也可yi用with. 这个混入这个词听着就hen高级, 何不... 感觉像是在调鸡尾酒一样,把各种味道倒进去摇一摇,一杯名为Bug的鸡尾酒就诞生了。

Scala特质

我想混进你的圈子还得按你的规矩来办事? 我就想问问,为什么要这么麻烦?直接写在一个类里不好吗?非得拆来拆去的,美其名曰解耦,我kan就是想让我多写几行代码累死拉倒。 这就像是我去买菜, 谨记... 非得让我先去买个篮子,再去买苹果,还得保证这个篮子必须Neng装苹果,这不是废话吗? 哎,不吐槽了继续往下kan吧,不然这篇SEO文章又得被老板打回了。

乱弹琴。 我真的太难了 我就想写个简单的增删改查,后来啊还得先去研究什么线性化超级调用链,脑壳疼。 Scala中类只Neng继承一个超类, 可yi 任意数量的特质. 这就好比你可yi只有一个亲爹, dan是可yi认hen多个干爹,每个干爹还Neng给你点零花钱huo者技Neng点啥的。特质 可yi要求实现它们的类具备特定的字段, 方法和超类. 霸道总裁啊这是!

怎么实现呢?头疼啊 /h3

要实现一个特质,在类定义时使用extends关键字,ran后使用with关键字加上特质 的名称即可. 听起来hen简单对吧?dan是写起来全是红波浪线!在上面的例子中,Gr 别纠结... eet是一个特质,Person类tong过extends关键字继承了Greet特质,并实现了sayHello方法, 在sayHello方法中调用了特质 中的greet方法。

!!

!!! /p h3 一下 虽然我hen生气但还是得写完收工/h3 pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp/pp .p不过与Java的接口不同 strongstyle="text-decoration:underline;" scala 特质可yi给出这些特性的缺省实现 refore 与接口相比 strongstyle="font-weight:bold;" 特质 要有用的多 ..3.和Java接口不同 strongstyle="font-size:20px;" scala 特质可yi提供方法和字段的实现 .. ./p .p缺省实现就是默认实现嘛非要拽英文词儿显得你读过书咋地其实想想也挺好用的不用每个类dou写一遍重复代码了DRY原则嘛Don't Repeat Yourself不然以后维护起来那是相当痛苦改一个小地方要动十个文件那时候你会想死的心dou有了虽然写的时候hen痛苦写完之后kan着那一堆extends with with with with... 还是有点成就感的吧大概也许可Neng我不确定反正我是没感觉到我只感觉到累困乏想睡觉zzZZZ......../p .p总之就是那样吧爱咋咋地下次再讲讲Actor模型那个geng让人头秃分布式并发编程简直就是地狱难度我现在光是想想就Yi经开始胃疼了今天就先到这儿吧我要去喝杯奶茶压压惊顺便刷刷短视频放松一下毕竟人生苦短何必为难自己去学这么难的语言呢Python它不香吗PHP它不香吗非得来受罪唉没办法为了生活为了房贷为了车贷忍了吧各位兄弟姐妹们共勉之加油奥利给!

。。。。。 br/ br/ 下面我们把上述代码放入一个完整的代码文件test. strongstyle="color:#333" scala /strong ,编译运行. 在Scala中没有接口的概念, 而是提供了 strongstyle="background-color:pink;" 特质 strongstyle="background-color:pink;" , 它不仅实现了接口的功Neng还具备了hen多其他的特性请登录Linux系统进入shell命令提示符状态ran后输入以下命令进入/usr/local/ strongstyle="color:#333" scala /strong /mycode目录打开vim编辑器: ./p ul li cd /usr/local/scala/mycode/li li vim test.scala/li li i /li li :wq /li li scalac test.scala /li li scala Test /li /ul table border="1" width="100%" bgc 嗯,就这么回事儿。 olor="#f0f8ff" caption align="bottom" Scala编译器报错信息翻译对照表/caption ad tr bgcolor="#add8e6" th英文原话/th th中文大概意思/th /tr /ad tbody tr tdnot found: type Logger/td td找不到Logger类型/td /tr tr tdillegal inheritance;/td td非法继承/td /tr tr tdvalue map is not a member of String;/td tdString没有map方法/td /tr /tbody /table 哎哟喂又要敲命令行我是程序员还是黑客啊每次dou要敲这些乱七八糟的路径手dou敲断了而且那个vim编辑器反人类设计我想复制粘贴dou费劲非得要用那几个奇怪的按键组合记不住记不住根本记不住每次dou要百度vim退出攻略简直是程序员的噩梦啊啊啊啊!

./p pRational?是有理数的意思吗?我感觉我现在就是个无理数irrational情绪极其不稳定为什么要有compare方法自己不知道谁大谁小吗还要计算机算气死我了以前写C++的时候重载运算符也是烦死人现在到了Scala还得搞个Ordered出来这是为了证明我们的逻辑思维有多严密吗我kan是为了证明我们的头发有多容易掉吧。

嗯,就这么回事儿。 。。。。 /p h2 排序也是个大坑 谁用谁知道 /h2 pstyle="font-family:'Courier New', Courier, monospace; color:green;" 注意kan!这里有个重点!敲黑板划重点啦考试必考题啊同学们!!! /p p而如guo使用trait,这些比较的方法就可yi封装在Ordered这个 strongstyle="color:#333" 特质 /strong 中.以后suo有需要实现比较 strongstyle="color:#333" 特质 /strong 的类, 它只要实现compare方法。

。。下面这个Logger特质的例子kan起来挺正经的其实暗藏杀机大家小心使用: /p pre code lang="scala" // 定义一个记录日志的 strongstyle="color:#333" 特质 /strong trait Logger { // 抽象方法,混入的类需要实现 def log: Unit // 具体方法 def info: Unit = log def warn: Unit = log } // ConsoleLogger 类实现.... strongstyle="color:#333" scala /strong // 定义一个记录日志的 strongstyle="color:#333" 特质 /strong trait Logger { // 抽象方法,混入的类需要实现 def log: Unit // 具体方法 def info: Unit = log def warn: Unit = log /pre code 等等上面那段话是不是重复了我好像粘贴了两遍不管了我懒得删了反正就是这么回事大家凑合着kan吧这就是所谓的具体方法和抽象方法的区别一个是现成的饭一个是半成品得你自己加工一下才Neng吃不过有时候现成的饭也可Neng有毒比如这个info方法它直接调用了log万一log里写了死循环那你就等着内存溢出吧哈哈哈哈,引起舒适。。

这些宠物名字Neng不Neng换点有创意的?比如“旺财”huo者“汤姆”? 算了老外写的代码就这样吧我们也只Neng忍着了毕竟人家技术强嘛我们要虚心学习不Neng总是抱怨虽然抱怨真的hen爽哈哈哈。。。。 /p h3 logging那些破事儿 必须吐槽一下 /h3 pstyle="background-color:#ffffcc; padding:10px; border:1px dashed #ff9900;" 你们有没有遇到过这种情况明明日志打了半天后来啊跑起来控制台一片空白啥doukan不见气得我想砸显示器后来才发现原来是Logger特质的log方法根本没写对真是日了狗了。

/code table border="1" cellpadding="5" width="100%" caption align="bottom"常见宠物特征对比表/caption ad tr bgcolor="#e6e6fa" th宠物类型/th th智商排名/th th掉毛严重程度/th th适合程序员饲养吗 /th th特制混入难度 /th /tr /ad tbody tr align="center" td狗/td td5-10名/td td严重/td td否/td td简单/td /tr tr align="center" td猫/td 不及格/td /tr tr align="center" td仓鼠/td 忽略不计/td /tr /tbody /table Sally和Harry又是谁?

拭目以待。 。。。 br/ br/ 下面这段代码演示了怎么用数组缓冲装宠物感觉就像是把一群猫猫狗狗关进笼子里一样可怜兮兮的: br/ code lang="scala" import strongstyle="color:#333" scala /strong .collection.mutable.ArrayBuffertraitPet{valname:String}classCatextendsPetclassDogextendsPetvaldog=newDogvalcat=newCatvalanimals=ArrayBuffer.emptyanimals.appendanimals.appendanimals.foreach)// Pr....凡是需要 strongstyle="color:#333" 特质 /strong 的地方,dou可yi由该 strongstyle="color:#333" 特质 /strong 的子类型来替换。

。。。 br/ br/ strongstyle="color:#333" . scala /strong 中特质是一个hen有用的特性, 有用是有用dan是学习成本太高了呀老板根本不 一言难尽。 给你时间去研究这些花里胡哨的东西只让你快点上线上线上线搞得我只Neng百度谷歌StackOverflow一顿抄抄完了还不知道原理是什么万一出了Bug我dou不知道从哪查起心里慌得一匹。

/p h2 不仅仅是接口那么简单 但真的hen烦人 /h2 p style="text-indent:2em" strongstyle="color:#333" scala /strong 中特质定义:包含一些字段,行为和一些未实现的功Neng接口的集合,可yi方便的实现 或混入到Yi有类或抽象类中. 我觉得这句话简直就是翻译腔重灾区读起来舌头dou要打结了什么叫未实现的功Neng接口的集合这不就是废话吗接口本来就是未实现的嘛还要强调一下生怕别人不知道似的还有那个方便的实现 我真的没觉得方便我只觉得麻烦每次重构dou要改一大堆trait名字改到手抽筋,扎心了...。

我不认识Rex。这只狗的名字为什么叫Rex?Neng不Neng叫旺财huo者二哈? 这些老外写教程Neng不Neng接地气一点? 而且那个AnyRef又是啥?不就是Object吗?非得换个名字显得自己hen高端? 你猜怎么着? 我觉得Scala这门语言Zui大的特点就是把简单的概念复杂化把复杂的概念神学化搞得我们凡人dou不敢碰了似的不过一旦你学会了确实会觉得hen爽这就叫Zuo抖M精神吧呵呵呵。

到位。 主要原因是没有getIdentifier提供的定义Identifiable,suo以Puppy该类必须实现它。只是,Puppy继承的实现printIdentification从Identifiable. /code kan到那个Puppy了吗?小狗!可爱是可爱,dan是代码报错的时候不可爱。 在REPL中: val p = new Puppy p.getIdentifier //res0:字符串=Rex的ID为K9 p.printIndenti... Rex是谁?

trait Identifiable { def getIdentifier: String def printIndentification: Unit = println } case class Puppy extends Identifiable { def getIdentifier: String = s $name has id $id } 由于没有为trait声明超类Identifiable,suo以呢默认情况下它是从AnyRefclass 的,白嫖。。

算了算了为了生计还是得学。 这里我得插一句哈,大家在配置IDEA的时候千万别选错了SDK版本不然你会发现你的代码跑起来跟外星人写的似的全是报错别问我怎么知道的血泪史啊!!! 我们再kan一段稍微正常点的代码例子吧虽然kan着也让人头大: code lang="scala" Scala特质 基础 2024-04-14 07:50:03304 示例 这是Scala中特性的Zui基本版本,啥玩意儿?。

. 我就纳闷了为啥非要extends一个ran后再with一堆呢?这不就是厚此薄彼吗? 那个extends出来的特权阶级是不是就比后面的with高贵一点? 这种语法糖吃多了容易蛀牙啊!而且你kan那些尖括号啊方括号啊kan得人眼花缭乱的。 有时候我真想回到C语言的时代,指针指哪打哪多爽,哪用管什么特质的线性化顺序啊。

2024年JVM语言开发者痛苦指数排行榜
JVM语言名称 编译速度


提交需求或反馈

Demand feedback