Ios 隐藏对父项的访问';子类中的s属性

Ios 隐藏对父项的访问';子类中的s属性,ios,swift,oop,Ios,Swift,Oop,我觉得这应该是相对简单的,但我找不到一个方法来完成它 假设我有 class Parent { public var file: PFFile? } 和一个子类 class Child : Parent { // some functionality that hides access to super.file } 问题是我不能处理父类,但我不希望任何使用子类的人都能访问“file”。如何在Swift中完成此操作?根据 可以防止重写方法、属性或下标 将其标记为最终版本。要做到这

我觉得这应该是相对简单的,但我找不到一个方法来完成它

假设我有

class Parent {
   public var file: PFFile?
}
和一个子类

class Child : Parent {
    // some functionality that hides access to super.file
}
问题是我不能处理父类,但我不希望任何使用子类的人都能访问“file”。如何在Swift中完成此操作?

根据

可以防止重写方法、属性或下标 将其标记为最终版本。要做到这一点,请先写最后一个修饰符 方法、属性或下标的介绍人关键字(如final) 变量、最终func、最终类func和最终下标)

所以您可以将父类声明为

class Parent {
   final var file: PFFile?
}
或者,如果您不能修改父类,那么这可能会起作用

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

也许这一个可以解决这个问题:

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:


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

class Perent {
    final var file: PFFile?
}    

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

我认为这在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
    }
}
这是一种黑客行为,但它几乎完全符合你的要求。它并没有对外界完全隐藏变量,但它使它变得无能为力。当您尝试访问
文件
时,总是会得到
nil
,而当您尝试为文件赋值时,它什么也不做。所以外界仍然知道
Child
有一个
file
类型为
PFFile?
的属性,但它对此无能为力

本质上,
文件
就像一个有吸引力的电影明星。你可以给他们写信,在他们的facebook墙上发帖,在他们的instagram订阅源上发表评论,但他们永远不会回复你。你知道他们是谁,他们长什么样,但你却无能为力


然后,在
Child
内部,您必须在所有地方使用
super.file
访问
父级
文件的
属性。如果您使用
file
self.file
您将试图与无效版本进行交互,并且每次都将一无所获!我已将
exampleFunction()
作为此用法的一个示例。(我在
PFFile
上创建了
description
属性,假设它是一个
String

删除
public
修饰符?不幸的是,我无法修改父类。您是否尝试重写存储属性?您重写了计算属性,而不是存储属性property@user3441734,可以重写存储的属性,但覆盖本身必须是计算属性@无论如何,
父级
受限父级
子级
示例不会编译,因为重写是一个存储属性。
类子级:父级
示例不会编译,因为重写需要是一个计算属性。他无法修改父级类
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
    }
}