定义只能从同一包中的后代访问的方法

Posted

技术标签:

【中文标题】定义只能从同一包中的后代访问的方法【英文标题】:Define method that could be accessed only from descendants within the same package 【发布时间】:2016-03-09 19:42:04 【问题描述】:

我想以某种方式指定只能从同一个包中定义的后代访问方法。这就像受保护的,但受到更多限制。

object Some 
  class Base 
    modifier[magic] def test() 
      println("ok")
    
  

  class Ok extends Base 
    test()
  

  class ShouldFail 
    def fail(b : Base) 
      b.test()
    
  


object Another 
  class ShouldFail extends Some.Base 
    test()
  

这就是我想要的

【问题讨论】:

您的示例中的软件包在哪里?如果我正确理解您的意思,Some 在某个包a 中,而Another 在一个包b 中。然后,您没有您想要的灵活性:您可以使用private[a],但随后Some.ShouldFail 将通过。或者您可以使用protected,但随后Another.ShouldFail 将通过。 【参考方案1】:

我有一个解决方案,过于冗长,而且访问受保护方法需要一些开销。

object Some 
  private[Some] class Access[T] private[Some] (aFun : () => T) 
    private[Some] def apply() : T = aFun()
  
  private[Some] object Access 
    private[Some] def apply[T](aFun : () => T) : Access[T] = new Access(aFun)
  

  class Base 
    private[this] def test() 
      println("ok")
    
    protected val accessTest = Access( () => test() )
  

  class Ok extends Base 
    accessTest()
  

  class ShouldFail 
    def fail(b : Base) 
      b.accessTest()
    
  


object Another 
  class ShouldFail extends Some.Base 
    accessTest()
  

这个想法是将方法包装在对象内,并在访问修饰符之间链接权限限制,以访问对象和访问对象内的值。不过,这会带来开销。

【讨论】:

以上是关于定义只能从同一包中的后代访问的方法的主要内容,如果未能解决你的问题,请参考以下文章

从同一包中的过程返回特定事物的函数[关闭]

使用 foreach 时无法从同一包中找到函数(Windows 开发)

Python:尝试从同一包中导入模块时出现“ModuleNotFoundError”

在 Python 3 中从同一包内和包外导入模块

有没有办法在 Java 中声明一个“友好”的方法?

使用 XCTest 访问自定义 UIView 中的后代控件