允许子类快速访问/覆盖函数,但不允许同一模块中的任何其他类
Posted
技术标签:
【中文标题】允许子类快速访问/覆盖函数,但不允许同一模块中的任何其他类【英文标题】:Allowing a function to be accessed/overriden by subclass but not any other class in same module in swift 【发布时间】:2020-01-22 17:35:48 【问题描述】:class MyClass
func sampleFunction()
假设,我有一个类,我希望其中的方法可以被它的任何子类访问/覆盖,但不能被同一模块中的任何其他类访问/覆盖。 swift 中没有这样的访问修饰符可以满足这个要求。在那种情况下,我怎样才能达到同样的效果。
【问题讨论】:
我对此感到困惑,你是说你不想用扩展来扩展它?任何其他类如何覆盖方法?除非你的意思是只有一级子类,而不是子类的子类? 模块?在这种情况下这是什么? @Knight0fDragon 我更新了我的帖子。我真正想要的是仅访问子类中的方法(我也可以覆盖它)但是如果我在任何其他类中创建 MyClass 的实例,则该方法应该是不可访问的 【参考方案1】:我想我知道你想做什么。正如马特所说,您需要将其标记为文件私有。
如果您在多个文件中有多个类,那么您需要通过扩展来完成。不过有一个警告,它必须声明为@objc。
//file X.swift
class X
//file Y.swift
class Y:X
//file X-Extensions.swift
fileprivate extension X
@objc func doit()
fileprivate extension Y
@objc override func doit()
//file Z.swift
class Z
let x = X()
func doit()
x.doit() //syntax error, doit not found for instance x
【讨论】:
在这种情况下,我也需要同一文件中的所有扩展名 正确,这里没有太多选择【参考方案2】:将其设为fileprivate
,并将所有其他需要查看的类放在同一个文件中。
(您正在尝试实现 protected
之类的东西,但 Swift 没有这样的访问规则。)
【讨论】:
是的,我试过了,但对我来说听起来不是一个解决方案,因为可能有多个子类,我不能把它们都放在一个文件中以上是关于允许子类快速访问/覆盖函数,但不允许同一模块中的任何其他类的主要内容,如果未能解决你的问题,请参考以下文章
为啥嵌套函数可以从外部函数访问变量,但不允许修改它们[重复]