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
}
}