隐藏对子类中父级属性的访问权限

时间:2015-11-03 06:36:27

标签: ios swift oop

我觉得这应该相对简单,但我无法找到实现目标的方法。

我说我有

class Parent {
   public var file: PFFile?
}

和子类

class Child : Parent {
    // some functionality that hides access to super.file
}

问题是我不能使用Parent类,但我不希望任何使用Child类的人有权访问'文件'。我怎样才能在Swift中实现这一目标?

4 个答案:

答案 0 :(得分:1)

也许这个解决了它:

class Parent {
   public var file: PFFile?
}

class RestrictedParent : Parent {
   private override var file: PFFile?
}

class Child : RestrictedParent {
    // some functionality that hides access to super.file
}

RestrictedParent中,我们可以隐藏任何继承给它的子类都不应该看到的功能。

修改

A part from doc

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

答案 1 :(得分:0)

根据Swift documentation

  

您可以阻止覆盖方法,属性或下标   将其标记为最终。通过之前编写最终修饰符来完成此操作   方法,属性或下标的介绍人关键字(如final   var,final func,final class func和final subscript)。

所以你可以将父类声明为

class Parent {
   final var file: PFFile?
}

或者,如果你不能修改父类,那么这可能会起作用

class Child : Parent {
   override private final var file: PFFile?
}

答案 2 :(得分:0)

我不认为这在Swift 3中是直接可行的。这是我能提出的最好的解决方法:

class Child : Parent {
    override public var file: PFFile? {
        get { return nil }
        set { }
    }
    func exampleFunction() {
        print(super.PFFile?.description)  // Use like this
        print(PFFile?.description)        // Don't do this
        //This ^^^ will ALWAYS return nil for PFFile
    }
}

这有点像黑客,但它几乎完全符合你的要求。它不会完全隐藏外部世界的变量,但它使它无能为力。当您尝试访问file时,您始终会获得nil,并且当您尝试为文件分配值时,它只会执行任何操作。因此,外界仍然知道Child具有file类型的属性PFFile?,但它无法对此做任何事情。

基本上,file就像一个有吸引力的电影明星。你可以发送信件,在他们的Facebook墙上发帖,评论他们的Instagram提要,但他们永远不会回复你。你知道他们是谁,他们看起来像什么,但你却无能为力。

然后,在Child必须使用super.file 无处不在,您可以访问Parent的{​​{1}}媒体资源。如果您使用filefile,您将尝试与无能为力的版本进行互动,而您每次都无所事事!我已将self.file作为此用法的示例。 (我在exampleFunction()上填写了description属性,只是假设它是PFFile

答案 3 :(得分:-1)

您可以使用final修饰符,如下所示:

class Perent {
    final var file: PFFile?
}    

class Child: Perent {
    // code here ...
}