2015-11-03 90 views
5

我覺得這應該是比較簡單的,但我找不到實現它的方法。隱藏對子類中父項屬性的訪問

讓說,我有

class Parent { 
    public var file: PFFile? 
} 

和子類

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

問題是我不能亂用父類,但我不使用子類希望任何人有權訪問'文件'。我怎樣才能在Swift中實現這一點?

+0

刪除'public'修飾符? – NeverHopeless

+0

不能修改父類不幸 –

回答

0

作爲每Swift documentation

可以防止的方法,屬性或下標從由標記爲最終被覆蓋 。通過在 之前寫入方法,屬性或下標的介紹人關鍵字(例如最終的 var,final func,final類func和final下標)來完成此操作。

,所以你可以聲明父類爲

class Parent { 
    final var file: PFFile? 
} 

或者,如果你不能修改父類的話,也許這會工作

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

你能'覆蓋'存儲的屬性嗎? hm ... – user3441734

+0

'class Child:Parent'示例不會編譯,因爲覆蓋需要是一個計算屬性。 – mogelbuster

0

也許這一個解決它:

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,我們可以隱藏任何繼承給它的子類都不應該可見的功能。

編輯

一個part from doc

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

你有沒有嘗試覆蓋存儲的屬性? – user3441734

+0

@ user3441734,請看看更新。 – NeverHopeless

+0

您可以覆蓋已計算的屬性,而不是已存儲的屬性 – user3441734

-1

您可以使用final改性劑,是這樣的:

class Perent { 
    final var file: PFFile? 
}  

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

他無法修改父類 – mogelbuster

0

我不認爲這是可能直接在斯威夫特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,並且當您嘗試將值分配給文件時,它什麼也不做。所以外界仍然知道Childfile類型PFFile?,但它只是無能爲力。

本質上,file就像一個有吸引力的電影明星。你可以發信給他們,張貼在他們的臉書牆上,評論他們的instagram feed,但他們永遠不會回覆你。你知道他們是誰,他們看起來像什麼,但你無能爲力。

然後,裏面ChildMUST使用super.fileEVERYWHERE訪問Parentfile財產。如果您使用fileself.file,您將嘗試與無能的版本進行交互,並且您什麼也不做,並且每次都沒有收穫!我已經包括exampleFunction()作爲這種用法的一個例子。 (我在PFFile上編了description財產,只是假設它是String