定义只能从同一包中的后代访问的方法
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 开发)