需要关于objective-c多态性和遗传的帮助吗
ClassA.h需要关于objective-c多态性和遗传的帮助吗,objective-c,inheritance,polymorphism,Objective C,Inheritance,Polymorphism,ClassA.h @interface classA -(void)print1; -(void)print2; @end @interface classB : classA -(void)print1; @end ClassA.m -(void)print1 { NSLog(@"I am class A 1"); } -(void)print2 { NSLog(@"I am class A 2"); } -(void)print1 { NSLog(@"
@interface classA
-(void)print1;
-(void)print2;
@end
@interface classB : classA
-(void)print1;
@end
ClassA.m
-(void)print1 {
NSLog(@"I am class A 1");
}
-(void)print2 {
NSLog(@"I am class A 2");
}
-(void)print1 {
NSLog(@"I am class B");
}
ClassA *a1 = [[ClassB alloc]init];
[a1 print1];
[a1 print2];
ClassB.h
@interface classA
-(void)print1;
-(void)print2;
@end
@interface classB : classA
-(void)print1;
@end
ClassB.m
-(void)print1 {
NSLog(@"I am class A 1");
}
-(void)print2 {
NSLog(@"I am class A 2");
}
-(void)print1 {
NSLog(@"I am class B");
}
ClassA *a1 = [[ClassB alloc]init];
[a1 print1];
[a1 print2];
AppDelegate.m
-(void)print1 {
NSLog(@"I am class A 1");
}
-(void)print2 {
NSLog(@"I am class A 2");
}
-(void)print1 {
NSLog(@"I am class B");
}
ClassA *a1 = [[ClassB alloc]init];
[a1 print1];
[a1 print2];
输出
I am class B
I am class A 2
错误
ClassB *a1 = [[ClassA alloc]init];
问题
ClassB
是ClassA
的子类,意思是ClassB
具有ClassA
的功能和自己的功能。但是ClassA
不知道ClassB
是它的孩子
那么如何classA*a1=[[classB alloc]init]代码>正在工作并提供上述输出
和classB*a1=[[classA alloc]init]对于classA*a1=[[classB alloc]init]的情况,code>给出了错误代码>正在工作,因为在objective-C中,方法是在运行时解析的[a1 print1]
向a1
对象发送一条消息,该消息可以是运行时调用方法print1
的任何内容。甚至您也可以调用[a1 some\u random\u method]
,其中编译器将给出警告,但不会给出错误。因为,在运行时,可能会添加一些随机方法
对于第二种情况,classB*a1=[[classA alloc]init]
,我认为您之所以会出现错误,是因为并非所有的classA
都是classB
classB
可能有额外的成员和方法。通过将classA
对象类型转换为classB
,您将尝试访问那些具有未定义行为的额外成员和方法。所以,编译器不支持从classA
到classB
的隐式类型转换,并给出错误信息
但是,您可以显式地将classA
对象类型转换为classB
。在运行时,您可以将classB
专用的方法添加到此对象(objective-C支持在运行时添加方法)并调用它们。[[classB alloc]init]
-这是您实际创建对象的部分,而
classA*a1
简单地说,只是,此对象的“预期”是什么。您的classB是classA的一个子类,因此它拥有classA所拥有的一切,因此在访问属性或使用方法时不会导致错误。
另一方面,当您创建classA实例并将其强制转换为classB时:
classB*a1=[[classA alloc]init]
编译器将期望该对象执行classB能够执行的操作,并且由于classB是classA扩展,它可能会导致错误。这实际上对大多数(可能是所有)OOP语言都有效。