2016-02-05 97 views
-1

編輯 - 對不起球員,我不認爲我給了足夠的細節:鑄造一類的子類失敗

在解析的iOS框架,他們是一個叫PFObject(ClassA的)類。該框架還允許您繼承(ClassB)PFObject。並且,如果發生這樣的情況應該發生,它們將是沒有問題。

我的問題是如何可能?我明白一個子類可能包含不會出現在主類中的變量/方法,從而導致將類轉換爲不合理/不安全的子類的過程。

他們有一個協議定義爲PFSubclassing,但我不明白這是怎麼發生這種行爲。


我有在操場下面:

class ClassA: NSObject { } 
class ClassB: ClassA { } 

let objectA = ClassA() 
let objectB = objectA as! ClassB // <- Crashes 

問題:

  • 爲什麼崩潰發生的?
  • 有沒有辦法解決這個問題?

回答

2

你知道繼承是如何工作的嗎? B類繼承自A類。當您創建ClassA的實例並嘗試將其轉換爲B類時,可能會發生許多不同的事情,因爲這是未定義的行爲。這裏的問題就是所謂的切片。編譯器拒絕從父類轉換爲子類,因爲它知道子類可能具有不同的信息(變量,函數等),並且不一定知道如何將它們轉換爲超類子實例的實例類。然而,反過來幾乎總是很好,例如

let objectB = ClassB() 
let objectA = objectB as? ClassA 
+0

感謝您的回答。 Parse的iOS SDK以某種方式允許這種行爲,但我試圖瞭解他們是如何做到的。他們有一個類PFObject(A類),並允許你從它創建一個任意類(比如說B類)。然後您可以將PFObject的對象投射到任意類!也許涉及方法調配? – Jason

+0

你的意思是說'如果讓castedClass = classB as? PFObject?'? – pbush25

1

子類繼承其超類的所有功能,並可以添加自己的功能。

從邏輯上講,您只能從更多或更少的功能(sub - > super)轉換類型,但反之亦然。

+0

感謝您的回答。 Parse的iOS SDK以某種方式允許這種行爲,但我試圖瞭解他們是如何做到的。他們有一個類PFObject(A類),並允許你從它創建一個任意類(比如說B類)。然後您可以將PFObject的對象投射到任意類!也許涉及方法調配? – Jason

+0

幕後必須有額外的邏輯(和特定的要求)來處理。 – vadian