在对象/类默认构造函数中干燥样板

埃里克·卡普伦

我有这样的事情:

abstract class RunnerBase { def printErrorAndBreak = ... }

object Runner1 extends RunnerBase {
  breakable {
    doSomething
    if (cond1) printErrorAndBreak(...)
  }
}

object Runner2 extends RunnerBase {
  breakable {
    if (cond1) printErrorAndBreak(...)
    something else
  }
}

我想将breakable { ... }零件移动RunnerBase这样,Runner1Runner2改为这样:

object Runner1 extends RunnerBase {
  doSomething
  if (cond1) printErrorAndBreak(...)
}

object Runner2 extends RunnerBase {
  if (cond1) printErrorAndBreak(...)
  something else
}

这有可能吗?还是将子对象逻辑包装为方法的唯一run方法?


更新:基于公认的答案(无论评论如何),出于健壮性和简单性的考虑,我决定采用以下方法:

class RunnerBase { def run = breakable _ }
class Runner1 { run { doSmth; if (?) printErrorAndBreak } }
class Runner2 { run { doSmth; if (?) printErrorAndBreak } }

这并不完美,因为仍然存在run { ... }重复,但至少breakablebreak被封装在中RunnerBase

詹姆斯·皮克

怎么DelayedInit

import scala.util.control.Breaks._

trait BreakInit extends DelayedInit {
  def delayedInit(body: => Unit) {
    breakable {body}
  }
}

class MyClass extends BreakInit {
  println("Hello World")
  break()
  println("Error - should not be reachable")
}

val a = new MyClass

在这种情况下,我们创建了一个BreakInit继承自的特征DelayedInit,该特征重写了delayedInitbreakable内调用构造函数方法MyClass然后将的构造函数汇总为一个函数,并传递给该delayedInit方法。正如@ som-snytt指出的那样,DelayedInit魔术只影响类构造函数,而不影响特征构造函数。

不过,在使用时,我建议您注意一些事项DelayedInit它涉及一些相当深的编译器魔术,魔术总是要付出代价的。就个人而言,我倾向于使用您的原始方法,因为涉及的魔术较少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在对象/类默认构造函数中干燥样板

来自分类Dev

在对象的构造函数中传递对象

来自分类Dev

减少类层次结构中的构造函数样板代码

来自分类Dev

在对象构造函数中引发异常

来自分类Dev

在Kotlin中无法在对象的超类构造函数中使用常量

来自分类Dev

类文件中的默认构造函数

来自分类Dev

如何在对象构造期间在函数中设置属性?

来自分类Dev

稀疏矩阵构造函数不在对象中存储参数

来自分类Dev

在对象内部使用对象的构造函数

来自分类Dev

在构造函数的默认构造对象中未声明变量

来自分类Dev

在 Serializable 类的构造函数中定义对象

来自分类Dev

如果默认构造函数是超类,则默认构造函数如何实例化对象,而无参数构造函数的主体为空?

来自分类Dev

构造函数中定义的类函数的默认参数

来自分类Dev

Scala:在对象或类中定义隐式函数

来自分类Dev

在另一个类对象中初始化一个对象(在对该构造函数执行一些操作之后)。

来自分类Dev

在另一个类对象中初始化一个对象(在对该构造函数执行一些操作之后)。

来自分类Dev

在Python中模拟类构造函数的默认参数

来自分类Dev

如果不在子类中创建子类对象,为什么父类必须具有默认构造函数?

来自分类Dev

在对象构造之前更新构造函数参数

来自分类Dev

为什么默认构造函数和参数化构造函数都在一个类中?

来自分类Dev

PHP类:在对象内部编写函数?

来自分类Dev

在C ++中,在对象创建之前或之后调用构造函数吗?

来自分类Dev

为什么替换构造函数的原型没有反映在对象中?

来自分类Dev

Python在对象构造函数中创建具有可变长度的2D数组

来自分类Dev

dart变量不等于在对象的构造函数中设置的值

来自分类Dev

如何解决流程中的“无法在对象类型上调用构造函数”错误?

来自分类Dev

从拉姆达访问对象在对象的构造函数传递

来自分类Dev

使用构造函数在对象内部创建对象

来自分类Dev

如何防止类内的类对象尝试在没有默认构造函数的情况下自动构造自身?

Related 相关文章

  1. 1

    在对象/类默认构造函数中干燥样板

  2. 2

    在对象的构造函数中传递对象

  3. 3

    减少类层次结构中的构造函数样板代码

  4. 4

    在对象构造函数中引发异常

  5. 5

    在Kotlin中无法在对象的超类构造函数中使用常量

  6. 6

    类文件中的默认构造函数

  7. 7

    如何在对象构造期间在函数中设置属性?

  8. 8

    稀疏矩阵构造函数不在对象中存储参数

  9. 9

    在对象内部使用对象的构造函数

  10. 10

    在构造函数的默认构造对象中未声明变量

  11. 11

    在 Serializable 类的构造函数中定义对象

  12. 12

    如果默认构造函数是超类,则默认构造函数如何实例化对象,而无参数构造函数的主体为空?

  13. 13

    构造函数中定义的类函数的默认参数

  14. 14

    Scala:在对象或类中定义隐式函数

  15. 15

    在另一个类对象中初始化一个对象(在对该构造函数执行一些操作之后)。

  16. 16

    在另一个类对象中初始化一个对象(在对该构造函数执行一些操作之后)。

  17. 17

    在Python中模拟类构造函数的默认参数

  18. 18

    如果不在子类中创建子类对象,为什么父类必须具有默认构造函数?

  19. 19

    在对象构造之前更新构造函数参数

  20. 20

    为什么默认构造函数和参数化构造函数都在一个类中?

  21. 21

    PHP类:在对象内部编写函数?

  22. 22

    在C ++中,在对象创建之前或之后调用构造函数吗?

  23. 23

    为什么替换构造函数的原型没有反映在对象中?

  24. 24

    Python在对象构造函数中创建具有可变长度的2D数组

  25. 25

    dart变量不等于在对象的构造函数中设置的值

  26. 26

    如何解决流程中的“无法在对象类型上调用构造函数”错误?

  27. 27

    从拉姆达访问对象在对象的构造函数传递

  28. 28

    使用构造函数在对象内部创建对象

  29. 29

    如何防止类内的类对象尝试在没有默认构造函数的情况下自动构造自身?

热门标签

归档