由于一个过于复杂的示例的组合而编辑,并且不清楚我的意图。
我有一个设计师将扩展和构建的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
类型的方法的情况下做到这一点。问题是,我没有提到SomeNewClass
或AnotherClass
(或设计师会做的任何其他东西(。我可以有一个隐式的,如下所示:
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