0

恐怕有点像内比的问题。简而言之,如果我想知道是否创建对象的子类,我可以使用父类的实例来仅引用该对象的父类属性吗?如果是这样,我可以在子类和父类之间自由切换吗?

例如,如果我将 B 定义为 A 的子类型,其中 - A 有方法 a - B 有方法 b

我可以创建 B 的实例,然后将其作为对象类型 A 引用吗

排序:B *b1;乙*b2; 一个*一个;

b1 = [[B alloc] init];

// Is this allowed?
a = (A *)b1;
b2= (B *)a;

// Are these valid?
[ a a];
[ b2 a];
[ b2 b];

(我在网上看到了很多关于一般子类化的讨论,但似乎没有什么可以解释我什么时候可以在一个类和它的超类之间转换)

4

3 回答 3

1

一切都在运行时解决;发送消息到a将产生相同的结果,无论您是否将其转换为 an A*

换句话说,演员表没有任何区别。如果您愿意,您可以将它们投射到NSString*,它仍然可以正常工作。

另一方面,使用 ARC,如果对象似乎没有响应发送的消息,您将收到编译时错误。

于 2012-09-16T08:07:31.343 回答
0

我不是 100% 确定第一个演员,但我认为这两个演员都是合法的。只要原始对象b1是 type ,第二个转换就有意义B。否则,发送B消息b2会导致错误 - 我认为当消息被发送到对象时调用的方法的默认实现是针对该类型未实现的方法。

此外发送这 3 条消息也是合法的。方法a对于类来说是公共的A,所以对象的类型AB响应消息ab2也响应b,因为它实际上指向一个类型的对象B

于 2012-09-16T08:04:30.317 回答
0
b1 = [[B alloc] init];
a = (A *)b1;
b2= (B *)a;

总结一下 - 你有一个对象,b1你正在创建两个对它的引用ab2.

您想知道是否可以调用 classB的方法,b2即使它以前是 class 的实例A

答案是肯定的,因为所有三个对象都是 B 类的实例。从一种类型转换为另一种类型是编译器如何解析方法调用的指标。

例如 - 如果你写:

id obj = b1;

然后尝试通过执行访问 B 类的属性

obj.someProperty;

你会得到一个编译器警告,但是如果你强制转换它:

(B *)obj.someProperty;

您没有收到警告,因为您已向编译器提供了信息。

Objective-C 是一种动态语言。所有三个对象都是 class 的实例B。将它们投射到其他类不会改变它们的类。

于 2012-09-16T08:06:30.517 回答