Scala 中的 C++ 嵌套类

Posted

技术标签:

【中文标题】Scala 中的 C++ 嵌套类【英文标题】:C++ nested classes in Scala 【发布时间】:2012-05-15 13:29:39 【问题描述】:

我正在学习 Scala,我来自 C++(很少有 Java 经验)。在我工作的地方,我们经常使用以下模式:

class SomeClass 
 public:
  class Options 
    ...
  ;
  SomeClass(const Options& options);
  ...
;

int main() 
  SomeClass::Options options;
  options.a = ...;
  ...
  SomeClass* sc = new SomeClass(options);

如何在 Scala 中进行模拟?

【问题讨论】:

【参考方案1】:

这是等价的:

object SomeClass 
    case class Options(option1: String, option2: Boolean)


class SomeClass(options: Options) 

    //this is constructor!
    println(options.option1)



object Main extends App 
    val options = SomeClass.Options("One", false)
    //or even:    SomeClass.Options(option1 = "One", option2 = false)
    val sc = new SomeClass(options)

关于嵌套类的更多信息(不要与 Java 中的内部类混淆):Static inner classes in scala。

评论:

Options 嵌套在 SomceClass object 中,而不是 class Options 可以是 case class - 这样您就可以免费获得不变性和访问器 在 Scala 中,您有一个以非常简洁的方式定义的主要构造函数 各种:Scala 默认使用按引用传递,所有变量实际上都是指针(与 C++ 相比,额外的符号更少)。

【讨论】:

如果有很多选项,你甚至可以使用命名参数使其更清晰。 嗯,看起来有点 hack-ish。假设我有一个类 (SomeClass) 和一堆相关的帮助类,它们仅在 SomeClass 的上下文中才有意义(例如,在我的示例中为 Options)。在 C++ 中,我可以嵌套所有相关的辅助类或引入类似 detail/internal 命名空间的东西。在 Scala 中这样做的首选方法是什么?请注意,关系是一些类和一个类之间的关系,而不是这个类的实例,所以我在这里不需要/想要依赖类型。 @Jasiu 您可以在 Scala 中将(子)类设为私有,它只会被对象及其类伴侣看到。

以上是关于Scala 中的 C++ 嵌套类的主要内容,如果未能解决你的问题,请参考以下文章

从 Java 访问 Scala 嵌套类

快学Scala 第八课 (嵌套类)

从外部类 C++ 正确调用嵌套类中的函数

如何在scala中模拟嵌套类

你能在 C++ 中保护嵌套类吗?

何时在 C++ 中的嵌套类上使用 Pimpl 模式,反之亦然?