Scala中的私有接口实现?

Scala中的私有接口实现?,scala,factory-pattern,code-organization,clean-architecture,Scala,Factory Pattern,Code Organization,Clean Architecture,用于VBA的Microsoft Excel对象模型提供了一个非常优雅的界面,使用户不会陷入太多麻烦 例如,不能将Dim myWs作为新工作表创建“自由浮动”工作表对象。您只能从现有工作簿创建它。例如: Dim myWs作为工作簿 设置myWs=thisvoolk.Sheets.Add 因为我可以访问工作表对象的属性和方法,所以我知道至少它的接口是公共的。但是它的实现(及其实现的构造函数)是完全隐藏的 我试图在Scala中创建一个类似的对象模型。但我不满意我被迫用工厂模式实现类似结果的方式。例如

用于VBA的Microsoft Excel对象模型提供了一个非常优雅的界面,使用户不会陷入太多麻烦

例如,不能将
Dim myWs作为新工作表创建“自由浮动”工作表对象。您只能从现有工作簿创建它。例如:

Dim myWs作为工作簿
设置myWs=thisvoolk.Sheets.Add
因为我可以访问工作表对象的属性和方法,所以我知道至少它的接口是公共的。但是它的实现(及其实现的构造函数)是完全隐藏的

我试图在Scala中创建一个类似的对象模型。但我不满意我被迫用工厂模式实现类似结果的方式。例如:

trait工作表{
变量名称:String
}
课堂练习册{
private var mySheets=List.empty[工作表]
def addSheet:工作表={
val newSheet=新工作表实施(s“Sheet${mySheets.size+1}”)
mySheets=mySheets:+新闻纸
新闻纸
}
私有类工作表实现(变量名称:字符串){…}
}
这里的问题是实现是在创建它的类中定义的

如果我的所有实现都是在其他类中定义的,那么在搜索实现时导航源代码就会变得越来越神秘和不明显——随着对象模型的增大,情况会变得更糟

我知道Scala中没有包专用访问器。是否有其他方法可以在单独的文件中定义每个实现,父类可以访问该文件,但父类的用户不能访问


注意:我实际上并没有试图在Scala中重新实现Excel对象模型。我只是把它作为问题的一个相关示例。

“我知道Scala中没有包专用访问器”您为什么决定这样做
private[somePackage]
protected[somePackage]
有很多方法可以实现您的要求,但这是一个过于笼统的问题,无法判断哪种方法最有效。有私有包访问器(正如@DmytroMitin所注意到的),有智能构造函数可以阻止自由创建新实例,如果你真的喜欢,你也可以使用一些带有私有子类型和镜头的ADT来设计你的代码。还有很多我现在想不到的方法。啊,在同伴对象中有私人类。谢谢,@DmytroMitin和Mateusz!到目前为止,我读到的所有东西都是这样说的:“在Scala中没有直接等价于Java的默认访问级别。”然而,我不知道访问限定符。你的提示让我回到了奥德斯基博士的书中,书中确实解释了一切。你还可以了解密封的特征/类别。在这种情况下,您不需要查看所有文件来查找您的trait的所有实现,并且您可以快速了解它的所有实现,因此您可以安全地对该trait使用模式匹配。