当前位置: 首页 > 知识库问答 >
问题:

带有特征的Scala客户机组合与实现抽象类

宋耀
2023-03-14

我在Scala中读到过,通常建议使用特征而不是抽象类来扩展基类。

下面是一个好的设计模式和布局吗?特征就是这样取代抽象的吗?

  • 客户端类(具有def功能1)
  • Trait1类(重写函数1)
  • Trait2类(重写函数1)
  • SpecificClient1使用trait1
  • 扩展客户端
  • SpecificClient2使用trait2
  • 扩展客户端

共有1个答案

仇浩旷
2023-03-14

我不知道您认为在Scala中应该更喜欢特征而不是抽象类的说法的来源是什么,但有几个理由不这样做:

  1. 特性使Java兼容性复杂化。如果您有一个带有伴生对象的trait,那么从Java调用伴生对象上的方法需要奇怪的mytype$.module$.mymethod语法。对于带有伴生对象的抽象类来说,情况并非如此,这些抽象类在JVM上作为一个具有静态和实例方法的类实现。用Java中的具体方法实现Scala特性更令人不快。
  2. 将带有实现的方法添加到trait中会破坏二进制兼容性,而将具体方法添加到类中不会。
  3. 特性会导致更多字节码和一些与使用转发器方法相关的额外开销。
  4. 特征更强大,这是不好的--一般来说,您希望使用功能最弱的抽象来完成工作。如果您不需要它们支持的那种多重继承(而且通常不需要),最好不要访问它。

最后一个原因在我看来是最重要的。在Scala的未来版本中,至少有几个其他问题可能会得到解决,但默认为类将以与良好设计一致的方式约束程序(至少可以说是这样),这种情况仍然存在。如果你决定你真的想要特质提供的力量,它们仍然会存在,但这将是你自己做出的决定,而不是你自己溜走的决定。

 类似资料:
  • 假设我有一个 我可以为任何我可能想要的结构实现,例如: 现在,我想自动我的特征,无论元组是由所有实现特征的类型组成的。直觉上,所有快乐的元组也是快乐的。 有可能做这样的事吗?例如,我可以简单地将的实现扩展到两种类型的任意元组: 因此,这可以完美地编译: 但是我怎么能把它推广到任何长度的元组呢?就我的理解而言,我们在Rust中没有变异的泛型。有变通办法吗?

  • 1 介绍   词频-逆文档频率法(Term frequency-inverse document frequency,TF-IDF)是在文本挖掘中广泛使用的特征向量化方法。 它反映语料中词对文档的重要程度。假设用t表示词,d表示文档,D表示语料。词频TF(t,d)表示词t在文档d中出现的次数。文档频率DF(t,D)表示语料中出现词t的文档的个数。 如果我们仅仅用词频去衡量重要程度,这很容易过分强调

  • 主要内容:实例,实例,特征构造顺序Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示: 实例 trait Equal {   def isEq

  • Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示: trait Equal { def isEqua

  •   CountVectorizer和CountVectorizerModel的目的是帮助我们将文本文档集转换为词频(token counts)向量。 当事先没有可用的词典时,CountVectorizer可以被当做一个Estimator去抽取词汇,并且生成CountVectorizerModel。 这个模型通过词汇集为文档生成一个稀疏的表示,这个表示可以作为其它算法的输入,比如LDA。   在训练

  •   Word2Vector将词转换成分布式向量。分布式表示的主要优势是相似的词在向量空间距离较近,这使我们更容易泛化新的模式并且使模型估计更加健壮。 分布式的向量表示在许多自然语言处理应用(如命名实体识别、消歧、词法分析、机器翻译)中非常有用。 1 模型   在MLlib中,Word2Vector使用skip-gram模型来实现。skip-gram的训练目标是学习词向量表示,这个表示可以很好的预测