2016-02-05 92 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