代码之家  ›  专栏  ›  技术社区  ›  Make42

鳞片性状的参数化

  •  0
  • Make42  · 技术社区  · 9 年前

    免责声明:这个问题不是关于我是否应该这样做,或者它是否是一个好的设计,也不是任何相关的推理。问题是我如何做到这一点。我稍后解释原因只是为了澄清。


    我可以参数化Scala特征吗?我知道它们不能有构造函数参数-有其他方法吗?例如(当然,这只是一个例子)

    case class MyMachine(myDouble: Double) {
        def methodEveryMachineHas(): Double = 2 * myDouble
    }
    
    trait Drivable {
        this: MyMachine =>
    
        def drive(x: Double): Double = HowToDriveFunction(x) * myDouble
    
    }
    
    object HowToDriveFunction extends (Double => Double) {
        def apply(x:Double): Double = x + 6.0
    }
    
    val myMachine1 = new MyMachine(3.0)
    myMachine1.methodEveryMachineHas // 6.0
    myMachine1.drive(4.0) // error
    
    val myMachine2 = new MyMachine(3.0) with Drivable
    myClass1.methodEveryMachineHas // 6.0
    myClass1.drive(4.0) // 30.0 = (4.0 + 6.0) * 3.0
    

    我怎么通过 HowToDriveFunction drive ?

    为什么我想要这个

    将逻辑上不同的事物表示为编程上不同的东西,从而生成有意义的代码

    函数应该固定锚定在对象(=实例化类)本身中。因此,我希望它在创造过程中给出。然而,并非全部 MyMachine 他们应该有驾驶能力。

    想象 成为一台机器,以及 Drivable 如何驱动函数 )这种特定机器(可能是汽车或飞机)的驱动方式。然而,为什么我要解释每台机器如何驾驶?这毫无意义。我只想向那些会开车的人解释。因此,我想给予 如何驱动函数 这意味着机器可以驾驶,因此首先应该能够驾驶。 怎样

    当然,我的实际工作与机器无关,这只是一个例子。

    trait HowToDriveFunction {
        this: Drivable =>
        ???
    }
    

    确保只有那些 可驾驶 如何驱动函数 ,但在我看来,这并不是那么漂亮,原因已经解释清楚了。

    以下是“继承之上的组合”

    最后但并非最不重要的一点,我认为拥有它很好 composition over inheritance

    1 回复  |  直到 9 年前
        1
  •  3
  •   0__    9 年前

    我不确定我是否完全理解这个问题,但它似乎归结为

    我怎么通过 HowToDriveFunction drive ?

    并且能够定义 MyMachine 而不可驾驶。

    Drivable .

    case class MyMachine(myDouble: Double) {
      def methodEveryMachineHas: Double = 2 * myDouble
    }
    
    trait Drivable {
      this: MyMachine =>
    
      protected def driveFunction: Double => Double
    
      def drive(x: Double): Double = driveFunction(x) * myDouble
    }
    
    object HowToDriveFunction extends (Double => Double) {
      def apply(x: Double): Double = x + 6.0
    }
    
    val myMachine1 = new MyMachine(3.0)
    myMachine1.methodEveryMachineHas // 6.0
    myMachine1.drive(4.0) // error
    
    val myMachine2 = new MyMachine(3.0) with Drivable { 
      val driveFunction = HowToDriveFunction
    }
    myMachine2.methodEveryMachineHas // 6.0
    myMachine2.drive(4.0) // 30.0 = (4.0 + 6.0) * 3.0
    
    推荐文章