Scala之旅-混合组成的类(CLASS COMPOSITION WITH MIXINS)

2024-01-13 07:32

本文主要是介绍Scala之旅-混合组成的类(CLASS COMPOSITION WITH MIXINS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mixins 就是用于组成类的 traits

abstract class A {val message: String
}
class B extends A {val message = "I'm an instance of class B"
}
trait C extends A {def loudMessage = message.toUpperCase()
}
class D extends B with C
val d = new D
println(d.message)  // I'm an instance of class B
println(d.loudMessage)  // I'M AN INSTANCE OF CLASS B

这里写图片描述
D 有一个父类 B 和一个 mixin C。类只能拥有一个父类但是可以拥有多个 mixin (分别使用关键字 extendswith )。mixin 和类可以拥有相同的父类。

现在让我们来看一个更有趣的例子,新建一个抽象类。

abstract class AbsIterator {type Tdef hasNext: Booleandef next(): T
}

该类中有一个抽象类型 T 和标准的迭代器方法。
接下来,我们将实现一个具体的类(实现抽象类中全部的成员,包括抽象类型 ThashNextnext 方法)

class StringIterator(s: String) extends AbsIterator {type T = Charprivate var i = 0def hasNext = i < s.lengthdef next() = {val ch = s charAt ii += 1ch}
}

StringIterator 实现类带有一个 String 类型参数的构造器,可用于对字符串进行迭代。(比如查看字符串中是否包含某个字符)
现在建立一个也继承 AbsIteratortrait

trait RichIterator extends AbsIterator {def foreach(f: T => Unit): Unit = while (hasNext) f(next())
}

只要有更多的元素,该 trait 就会循环调用在下一个元素 (next()) 上的函数 f: T = > Unit 来实现 foreach
因为 RichIterator 是一个 trait,所以它不需要实现 AbsIterator 中的抽象成员属性或方法。

下面我们把 StringIteratorRichIterator 中的功能组合成单个类。

object StringIteratorTest extends App {class RichStringIter extends StringIterator("Scala") with RichIteratorval richStringIter = new RichStringIterrichStringIter foreach println
}

新类 RichStringIter 有一个 StringIterator 父类和 RichIterator 作为 mixin

如果是单一继承,我们将无法达到这样的灵活性

这篇关于Scala之旅-混合组成的类(CLASS COMPOSITION WITH MIXINS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600673

相关文章

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

Spring Boot 注解探秘:HTTP 请求的魅力之旅

在SpringBoot应用开发中,处理Http请求是一项基础且重要的任务。Spring Boot通过提供一系列丰富的注解极大地简化了这一过程,使得定义请求处理器和路由变得更加直观与便捷。这些注解不仅帮助开发者清晰地定义不同类型的HTTP请求如何被处理,同时也提升了代码的可读性和维护性。 一、@RequestMapping @RequestMapping用于将特定的HTTP请求映射到特定的方法上

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

28.8K Star,音乐新体验,开启你的高颜值音乐之旅

Hi,骚年,我是大 G,公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 导语 音乐是生活中不可或缺的调味品,一个好的音乐播放器能够极大地提升我们的听觉享受。今天,我要向大家推荐一个名为 YesPlayMusic 的第三方网易云音乐播放器,它不仅拥有高颜值的界面设计,还支持跨平台使用,让你的音乐体验更上一层楼

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x&... 有时,有两个或多个类,其功能是相同的,仅仅是数

杨bob的技术之旅

杨bob今天正式入驻csdn,以后要把自己每一点滴写成文章,这也是冲高阶的毕竟之路

Python方法:__init__,__new__,__class__的使用详解

转自:https://blog.csdn.net/qq_26442553/article/details/82464682 因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际

Midjourney 随机风格 (Style Random),开启奇幻视觉之旅

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:       Midjourney 最近推出了 "Style Random"(随机风格),这项功能可以让我们使用独特的随机 sref 代码创建图像,从而每次都能获得不同的美感。通过对这些功能的探索和尝试,我发现了一些很棒的风格,我很高兴能与大家分享,这样可以节省大家的时间,不用自己动手测试。在本文中,我将展示十个M

SpringBoot启动报错Failed to determine a suitable driver class

两种解决办法 1.在Application类上加 ` @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) package com.example.demo3;import org.springframework.boot.SpringApplication;import org.springframewo