【问题标题】:Scala object private scope with inner classes and methods具有内部类和方法的 Scala 对象私有范围
【发布时间】:2012-02-03 02:09:51
【问题描述】:

我对使用相同对象的方法访问对象的私有内部类有点困惑。这是我在 Scala 编程中的练习代码(第 245-246 页):

import Element.elem

abstract class Element {
    def contents: Array[String]
    def height = contents.length
    def width = if(height == 0) 0 else contents(0).length

    def above(that: Element): Element = elem(this.contents ++ that.contents)

    def beside(that: Element): Element = {
    elem( for(
            (line1, line2) <- this.contents zip that.contents)
            yield line1 + line2 )
    }

    override def toString = contents mkString "\n"
 }


 object Element {

    private class ArrayElement (
            val contents: Array[String]
    ) extends Element

    private class LineElement (s: String) extends ArrayElement(Array(s)) {
            override def width = s.length
            override def height = 1
    }

    private class UniformElement (
            val ch: Character,
            override val width: Int,
            override val height: Int
    ) extends Element {
            private val line = ch.toString * width
            def contents = Array.fill(height)(line)
    }

    def elem(ss: Array[String]) = new ArrayElement(ss)
    def elem(s: String) = new LineElement(s)
    def elem(ch: Character, w: Int, h: Int) = new UniformElement(ch, w, h)

 }

代码和书中的一样,但是编译器会抱怨 Element 对象底部的三个def elem() 方法。错误说:

私有类 ArrayElement 作为类型的一部分逃脱其定义范围 pis.Code_c10s02_CompositionAndInheritance.Element.ArrayElement

但是,如果我从内部类中删除 private 修饰符,一切都会好起来的。这不应该是解决方案,这本书的这一部分似乎本质上是关于将对象内部的类私有化。我的错误是什么?

【问题讨论】:

    标签: scala private inner-classes


    【解决方案1】:

    由于某种原因,它宁愿编译失败也不愿推断出一个不太具体但公共的类型。用返回类型声明 elem 方法。

    def elem(ss: Array[String]): Element             = new ArrayElement(ss)
    def elem(s: String): Element                     = new LineElement(s)
    def elem(ch: Character, w: Int, h: Int): Element = new UniformElement(ch, w, h)
    

    【讨论】:

    • 我想到了更多,然后是这个问题的下一部分:为什么在每种情况下返回的类型都必须是 Element 而不是该方法用于的特定类型创建一个对象?我认为这在某种程度上与隐私/公开有关,但我不明白这一点......它有什么真正的意义还是编译器的怪癖?
    • 该类型是私有的,因此在其定义范围之外是不可见的。听起来你真正想要的是一个私有构造函数。
    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多