需要关于objective-c多态性和遗传的帮助吗

需要关于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(@"

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(@"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语言都有效。