【问题标题】:What's the use case of secondary constructors in abstract classes?抽象类中辅助构造函数的用例是什么?
【发布时间】:2011-08-31 10:06:13
【问题描述】:

考虑这段代码:

abstract class Foo(val s: String) {
  def this(i: Int) = this("" + (i+2))
}

据我所知,构造函数不是继承的,二级构造函数不能像在 Java 中那样从带有super 的子类调用。

它们只是一个无用的工件还是这个构造有一些合理的用例?

【问题讨论】:

    标签: scala constructor abstract-class language-design


    【解决方案1】:
    scala> object Bar extends Foo(3)
    defined module Bar
    
    scala> Bar.s
    res3: String = 5
    

    【讨论】:

      【解决方案2】:

      子类的主构造函数必须调用超类的构造函数之一,不一定是主构造函数。

      abstract class A(s: String) {
        def this(i: Int) = this(i.toString)
      }
      class B(i: Int) extends A(i)
      

      【讨论】:

        【解决方案3】:

        除了@coubeatczech 的回答之外,如果您添加细化,您还可以创建抽象类(和特征)的实例,

        scala> :paste
        // Entering paste mode (ctrl-D to finish)
        
        abstract class Foo(val s: String) {
          def this(i: Int) = this("" + (i+2))
        }
        
        // Exiting paste mode, now interpreting.
        
        defined class Foo
        
        scala> val f = new Foo(23) {}
        f: Foo = $anon$1@13d874e
        
        scala> f.s
        res3: String = 25
        

        虽然我在上面展示了一个空的改进(“{}”),但您通常会提供一些额外的定义,通常为抽象成员提供实现,

        scala> abstract class Bar { def bar : Int }
        defined trait Bar
        
        scala> val b : Bar = new Bar { def bar = 23 }
        b: Bar = $anon$1@1e17c6d
        
        scala> b.bar
        res1: Int = 23
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-28
          • 2012-12-25
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 2011-03-11
          • 1970-01-01
          相关资源
          最近更新 更多