子类“是”类混淆了我

时间:2012-04-01 05:50:05

标签: objective-c oop

我正在研究归档数据,我意识到标准集合类提供了简单的归档,但我想归档NSMutableArray。所以我读到,因为NSMutableArray“是一个”NSArray因为它是一个子类,所以这很好。

但是这个想法让我感到困惑,我意识到这是Objective-C的一个基本概念,所以我想确保我做对了。

假设你有一个带有子类“吉普”的“汽车”类。现在根据以上内容,您可以这样说:

automobileInstance=jeepInstance;

...因为吉普车是汽车的子类。

但这似乎对我不利。我认为你应该说一个子类实例可以等于它的超类实例:

jeep = auto

因为毕竟吉普车是“汽车”,但并非所有汽车都是吉普车。

那么为什么你能做到这一点:

NSArray*newArray=nsmutableArrayInstance;

这与想法相同:

automobile=jeep;在我的例子中。

例如,你的子类可能添加了许多新的实例变量,但是如果你将它设置为超类,那些iVars会“丢失”或至少超类不能识别它们,所以它不是真的捕获对象,它似乎。

走另一条路,说sublass instance = superclass instance是有意义的,因为超类中的所有东西都在子类中;你只是没有获得子类中但不在超类中的额外iVar的值,它们可能被设置为默认值为零,但至少它们存在。

3 个答案:

答案 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;

很明显,我们谈论的是一辆特定的汽车,而不是所有汽车。