每当声明 val/var 时调用方法/函数(不调用显式方法/函数)

  • 本文关键字:方法 函数 调用 var 声明 val scala
  • 更新时间 :
  • 英文 :


由于一个过于复杂的示例的组合而编辑,并且不清楚我的意图。

我有一个设计师将扩展和构建的class。为了保持代码干净,我希望能够在实例化特定类时执行操作组合。

我知道我可以使用带有自定义apply()的 Companion 对象来完成大部分工作,并且除了我需要知道实例化特定类的类(并且我试图避免将this作为参数传递(。

class Apple{}
class Orange{}
class MyBase{
val allApples  = ListBuffer[Apple]()
val allOranges = ListBuffer[Orange]()
}
//User defined classes extending MyBase
class SomeNewClass extends MyBase{
val apple1 = new Apple   //we would want to add apple1 to the allApples List
val apple2 = new Apple
val orange1 = new Orange
}
class AnotherClass extends MyBase{
val someClass = new SomeNewClass
val apple1 = new Apple
}

所以你可以看到我希望能够将Apple实例添加到allApples ListBuffer中,并且对于橙色也是如此。我希望能够在不需要addApple类型的方法的情况下做到这一点。问题是,我没有提到SomeNewClassAnotherClass(或设计师会做的任何其他东西(。我可以有一个隐式的,如下所示:

class Apple()(implicit myBaseCaller : MyBase){
myBaseCaller.addApple(this)
}
class MyBase{
implicit val myself : MyBase = this
//excluded for clarity
}

在这种特殊情况下,在扩展MyBase的类之外实例化新的Apple或Orange将违反DSL。

所以我不反对最好的解决方案是添加Apple的显式方法,但是我正在尝试查看是否有一种在编码上更容易的解决方案。

可能没有一个像样的方法可以做到这一点,这没关系。在这种情况下,我不介意在基类中增加一点额外的开销,以使扩展类更易于编写。

删除了太复杂的原始问题

在扩展MyBase的类之外实例化新的Apple或Orange将违反DSL。

从上下文中不清楚这是否可取。

无论如何,您是否考虑过使用私有构造函数和公共辅助构造函数可以实现什么?

import scala.collection.mutable.ListBuffer
class MyBase{
class Apple private (lb :ListBuffer[Apple]) {
lb += this
def this() = this(allApples)
}
class Orange private (lb :ListBuffer[Orange]) {
lb += this
def this() = this(allOranges)
}
val allApples  = ListBuffer[Apple]()
val allOranges = ListBuffer[Orange]()
}
class SomeNewClass extends MyBase{
val apple1 = new Apple
val apple2 = new Apple
val orange1 = new Orange
}
class AnotherClass extends MyBase{
val someClass = new SomeNewClass
val apple1 = new Apple
}
val snc = new SomeNewClass
val ac = new AnotherClass
snc.allApples.size   //res0: Int = 2
snc.allOranges.size  //res1: Int = 1
ac.allApples.size    //res2: Int = 1
ac.allOranges.size   //res3: Int = 0

最新更新