我覺得這應該是比較簡單的,但我找不到實現它的方法。隱藏對子類中父項屬性的訪問
讓說,我有
class Parent {
public var file: PFFile?
}
和子類
class Child : Parent {
// some functionality that hides access to super.file
}
問題是我不能亂用父類,但我不使用子類希望任何人有權訪問'文件'。我怎樣才能在Swift中實現這一點?
我覺得這應該是比較簡單的,但我找不到實現它的方法。隱藏對子類中父項屬性的訪問
讓說,我有
class Parent {
public var file: PFFile?
}
和子類
class Child : Parent {
// some functionality that hides access to super.file
}
問題是我不能亂用父類,但我不使用子類希望任何人有權訪問'文件'。我怎樣才能在Swift中實現這一點?
可以防止的方法,屬性或下標從由標記爲最終被覆蓋 。通過在 之前寫入方法,屬性或下標的介紹人關鍵字(例如最終的 var,final func,final類func和final下標)來完成此操作。
,所以你可以聲明父類爲
class Parent {
final var file: PFFile?
}
或者,如果你不能修改父類的話,也許這會工作
class Child : Parent {
override private final var file: PFFile?
}
你能'覆蓋'存儲的屬性嗎? hm ... – user3441734
'class Child:Parent'示例不會編譯,因爲覆蓋需要是一個計算屬性。 – mogelbuster
也許這一個解決它:
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)"
}
}
你有沒有嘗試覆蓋存儲的屬性? – user3441734
@ user3441734,請看看更新。 – NeverHopeless
您可以覆蓋已計算的屬性,而不是已存儲的屬性 – user3441734
您可以使用final
改性劑,是這樣的:
class Perent {
final var file: PFFile?
}
class Child: Perent {
// code here ...
}
他無法修改父類 – mogelbuster
我不認爲這是可能直接在斯威夫特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
就像一個有吸引力的電影明星。你可以發信給他們,張貼在他們的臉書牆上,評論他們的instagram feed,但他們永遠不會回覆你。你知道他們是誰,他們看起來像什麼,但你無能爲力。
然後,裏面Child
你MUST使用super.file
EVERYWHERE訪問Parent
的file
財產。如果您使用file
或self.file
,您將嘗試與無能的版本進行交互,並且您什麼也不做,並且每次都沒有收穫!我已經包括exampleFunction()
作爲這種用法的一個例子。 (我在PFFile
上編了description
財產,只是假設它是String
)
刪除'public'修飾符? – NeverHopeless
不能修改父類不幸 –