我觉得这应该相对简单,但我无法找到实现目标的方法。
我说我有
class Parent {
public var file: PFFile?
}
和子类
class Child : Parent {
// some functionality that hides access to super.file
}
问题是我不能使用Parent类,但我不希望任何使用Child类的人有权访问'文件'。我怎样才能在Swift中实现这一目标?
答案 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
中,我们可以隐藏任何继承给它的子类都不应该看到的功能。
修改强>:
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
答案 1 :(得分:0)
您可以阻止覆盖方法,属性或下标 将其标记为最终。通过之前编写最终修饰符来完成此操作 方法,属性或下标的介绍人关键字(如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}}媒体资源。如果您使用file
或file
,您将尝试与无能为力的版本进行互动,而您每次都无所事事!我已将self.file
作为此用法的示例。 (我在exampleFunction()
上填写了description
属性,只是假设它是PFFile
)
答案 3 :(得分:-1)
您可以使用final
修饰符,如下所示:
class Perent {
final var file: PFFile?
}
class Child: Perent {
// code here ...
}