我正在研究归档数据,我意识到标准集合类提供了简单的归档,但我想归档NSMutableArray
。所以我读到,因为NSMutableArray
“是一个”NSArray
因为它是一个子类,所以这很好。
但是这个想法让我感到困惑,我意识到这是Objective-C的一个基本概念,所以我想确保我做对了。
假设你有一个带有子类“吉普”的“汽车”类。现在根据以上内容,您可以这样说:
automobileInstance=jeepInstance;
...因为吉普车是汽车的子类。
但这似乎对我不利。我认为你应该说一个子类实例可以等于它的超类实例:
jeep = auto
因为毕竟吉普车是“汽车”,但并非所有汽车都是吉普车。
那么为什么你能做到这一点:
NSArray*newArray=nsmutableArrayInstance;
这与想法相同:
automobile=jeep;
在我的例子中。
例如,你的子类可能添加了许多新的实例变量,但是如果你将它设置为超类,那些iVars会“丢失”或至少超类不能识别它们,所以它不是真的捕获对象,它似乎。
走另一条路,说sublass instance = superclass instance
是有意义的,因为超类中的所有东西都在子类中;你只是没有获得子类中但不在超类中的额外iVar的值,它们可能被设置为默认值为零,但至少它们存在。
答案 0 :(得分:1)
这样想:所有的吉普车都是汽车。并非所有汽车都是吉普车。所以你可以说:
汽车a = jeepInstance; //吉普车总是一辆汽车
但不是:
Jeep j = autoInstance; //失败 - autoInstance可能是马自达,而不是。
答案 1 :(得分:1)
超类指针可以指向从子类分配的对象,因为超类的类成员始终存在于子类中。
autoMobilePointer = jeepObject; // works
反之,情况并非如此,因为子类具有超类中不存在的成员。
jeepPointer = autoMobileObject; // doesn't work
答案 2 :(得分:1)
我认为这里的问题是你混淆了赋值和平等,也许是类和对象。请记住,=
表示赋值,而==
和-isEqual
是对相等性的测试。如果B是A的子类,则每个B 都是 A,就像每个Jeep 是汽车一样,每个人都是哺乳动物。
但是当你说:
automobile = jeep;
您正在做的是将jeep
的值分配给变量automobile
。你不说世界上的每辆汽车都是吉普车,你说的是具体的变量automobile
是指吉普车的特定实例。就像我问你一样:
你开什么车?
在我的脑海中,我希望你回复一些汽车的信息。您可以说我为您的答案保留的内存位置类型为Automobile*
,因为它可以指代任何汽车。你回复:
我开着那辆停在树旁的红色吉普车。
为变量选择更具描述性的名称可能会有所帮助。使用特定的东西,例如:
Automobile *theCarThatAndrewxDrives = jeep;
很明显,我们谈论的是一辆特定的汽车,而不是所有汽车。