Scala中C++风格的私有访问

C++-style private access in Scala?

本文关键字:访问 风格 C++ Scala      更新时间:2023-10-16

在C++中,可以有(请原谅错误,因为我已经有一段时间没有做C++了,我们很感激您的更正):

class Super {
    private: virtual void g() = 0;
    public: void f() {
        g();
    }
};
class Sub: public Super {
    private: virtual void g() {
    }
};

使得CCD_ 1定义了CCD_。

同样的事情能在Scala中完成吗?

如果你像这样尝试

abstract class Super {
  private def g()
  def f() {
    g()
  }
}

编译器会给你这个错误信息:

scala:抽象成员不能有私有修饰符
私有def g()

您必须至少声明protectedg()

我认为最接近的是

abstract class Super {
  protected[this] def g: Int
  def f { println(g) }
}
class Sub extends Super {
  protected[this] def g = 5
}

但这并不给予CCD_ 5比CCD_ 6更多的访问权限;它只是阻止CCD_ 7在其他实例上调用该方法。

完全相同的模式在Scala中是不可能的。(这必须是编译器虚构的,因为JVM不支持它,但许多访问模式已经是编译器虚构。)