允许子类快速访问/覆盖函数,但不允许同一模块中的任何其他类

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 没有这样的访问规则。)

【讨论】:

是的,我试过了,但对我来说听起来不是一个解决方案,因为可能有多个子类,我不能把它们都放在一个文件中

以上是关于允许子类快速访问/覆盖函数,但不允许同一模块中的任何其他类的主要内容,如果未能解决你的问题,请参考以下文章

为啥嵌套函数可以从外部函数访问变量,但不允许修改它们[重复]

第六周&java实验报告四

配置GCS存储桶以允许公共写入但不允许覆盖

为啥 Java 中的“protected”修饰符允许访问同一包中的其他类?

覆盖Java中的私有方法

允许 VPC 中的 Lambda 访问同一 VPC 中的 Elasticsearch 域