你如何覆盖 Scala 中的字段?

How do you override fields in Scala?

比如buf在BAOS中是受保护的变量。我想public。目前,我求助于重名

    class Baos extends ByteArrayOutputStream {
        def getbuf = buf // expose the buffer
    } 

我可以在不发明另一个名称的情况下更改可见性,就像我重写方法一样吗?

buf 是受保护的变量:

   26   package java.io;
   ...
   45   public class ByteArrayOutputStream extends OutputStream {
   46   
   47       /**
   48        * The buffer where data is stored.
   49        */
   50       protected byte buf[];

因此只有两种访问方式:

  • 像你一样暴露它或
  • java.io 包中的 class 访问它

我看不到 "change the visibility" 的任何方法。但是我会问自己为什么要冒着 Liskov substitution principle 问题的风险公开访问该内部变量。

Protected variables generally have some intrinsic invariance associated with them (or else they'd be public). Inheritors then need to maintain those properties, which people can screw up or willfully violate.

基地 class 可能正在做出许多关于 buf 不被外部访问的假设,以免违反 Open/closed principle.

我宁愿关注"favour composition over inheritance"。