所以我是新手学习Objective-C和OOP。我一直在看Udemy的一些视频,并没有真正理解子类的工作原理。他创建了一个名为“Vehicle”的可可触摸类,它是“Viewcontroller”的子类。现在,这是否意味着viewcontroller现在可以访问“Vehicle”中的方法?
接下来,他创建了一个名为“Civic”的子类“Vehicle”。他在Civic.m中创建了一个方法:-(void)test
{
self.make = @"Honda";
self.model = @"Civic";
}
如果我在我的viewcontroller.m文件中执行此操作,那么当我创建该类的实例时,它不应该设置模型并制作Honda和Civic吗?
vehicle *civic1 = [[vehicle alloc]init];
NSLog(@"print out the make and model: %@ and %@", civic1.make,
civic1.model);
相反,它为两者打印出null。这是为什么?
答案 0 :(得分:0)
这两个属性都是零,因为你从不调用" test"功能
'strict' => false
您遇到的下一个问题是您正在创建Vehicle实例,而不是Civic实例。由于test是Civic类的方法,因此不允许调用该方法。
更改您的代码,以便创建思域而不是车辆。
选项1
vehicle *civic1 = [[vehicle alloc]init];
//here the call
[civic1 test];
//
NSLog(@"print out the make and model: %@ and %@", civic1.make,
civic1.model);
1选项
vehicle *civic1 = [[civic alloc]init]; //pointer to a vehicle.. but creating a civic
//here the call
[((civic*)civic1) test]; //typecast the vehicle pointer to use it as the civic it is
//
答案 1 :(得分:0)
您需要在test
课程中声明Vehicle
方法。您的Vehicle
类必须让子类Civic
重新定义方法声明,然后多态应该有效。如果你有其他子类,测试方法将调用到正确的类而不转换和检查类型,然后这段代码:
vehicle *civic1 = [[vehicle alloc]init];
[civic1 test];
NSLog(@"print out the make and model: %@ and %@", civic1.make,
civic1.model);
应该有用。
希望这有帮助。