如何访问嵌套在抽象类中的类中的方法?

时间:2016-11-19 16:05:23

标签: scala

UPDATE [已解决]:需要将门放在嵌套的Wire类之外(感谢Dima)。

编辑:我不确定为什么我对这个问题进行了投票。这是一个合法的问题,因为我正在参加Martin Odersky的Reactive Programming的在线课程,如果你自己去看看讲座3.6“离散事件模拟实现和测试”,你会看到Martin完全按照我做了,他没有得到这些错误。这不是一个任务,所有代码都已呈现,我只是从幻灯片中复制它。您可以在实际视频中看到以下屏幕截图,其中显示门是内写入。

enter image description here enter image description here

我有一个抽象类Circuits(在文件Circuits.scala中),它扩展了一个抽象类Gates。在Gates内定义了一个类Wire(Gates和Wire都在文件Gates.scala中)。在这个类Wire内部定义了几个函数,其中一个是orGate。当我尝试访问orGate内的Wire和其他函数时,IDE会抱怨symbol not found。我需要做些什么特别的事情才能orGate显示Circuits等?代码片段用于说明我的问题。

文件Circuits.scala:

package week3      
abstract class Circuits extends Gates {

      def halfAdder(a: Wire, b: Wire, s: Wire, c: Wire) {
        val d, e = new Wire
        orGate(a, b, d)      // <--- symbol not found: orGate
        andGate(a, b, c)     // <---- symbol not found: andGate 
        inverter(c, e)       // <--- etc.
        andGate(d, e, s)
      }

      def fullAdder(a: Wire, b: Wire, cin: Wire, sum: Wire, cout: Wire) {
        val s, c1, c2 = new Wire
        halfAdder(a, cin, s, c1)
        halfAdder(b, s, sum, c2)
        orGate(c1, c2, cout)
      }

    }

file:Gates.scala:

package week3


abstract class Gates extends Simulation {

  def InverterDelay: Int
  def AndGateDelay: Int
  def OrGateDelay: Int

  class Wire {

    private var sigVal = false
    private var actions: List[Action] = List()

    def getSignal: Boolean = sigVal
    def setSignal(s: Boolean): Unit = {
      if (s != sigVal) {
        sigVal = s
        actions foreach (_())
      }
    }
    def addAction(a: Action): Unit = {
      actions = a::actions
      a()
    }

    def inverter(input: Wire, output: Wire): Unit = {
      def invertAction(): Unit = {
        val inputSig = input.getSignal
        afterDelay(InverterDelay) { output setSignal !inputSig}
      }
      input addAction invertAction
    }


    def andGate(in1: Wire, in2: Wire, output: Wire): Unit = {
      def andAction(): Unit = {
        val in1Sig = in1.getSignal
        val in2Sig = in2.getSignal
        afterDelay(AndGateDelay) {output setSignal (in1Sig & in2Sig)}
      }

      in1 addAction andAction
      in2 addAction andAction
    }


    def orGate(in1: Wire, in2: Wire, output: Wire): Unit = {
      def orAction(): Unit = {
        val in1Sig = in1.getSignal
        val in2Sig = in2.getSignal
        afterDelay(OrGateDelay) {output setSignal (in1Sig | in2Sig)}
      }

      in1 addAction orAction
      in2 addAction orAction
    }

    def probe(name: String, wire: Wire): Unit = {
      def probeAction(): Unit = {
        println(name, currentTime, wire.getSignal)
      }
      wire addAction probeAction
    }


  }
}

1 个答案:

答案 0 :(得分:-1)

Page以及除orGateaddAction之外的大多数其他内容都应在setSignal之外定义。

另外,你真的在​​这里编写java代码(虽然是scala语法)。我鼓励您查找有关scala的书籍或在线资源,并阅读前几章,以熟悉该语言的基本概念和范例。