黑马程序员技术交流社区

标题: oc继承总结 [打印本页]

作者: a380vs747`    时间: 2015-3-25 15:51
标题: oc继承总结
1、继承
子类继承父类,子类拥有父类当中的所有属性和方法。
当然,这里要探讨一下父类public、private、protected属性在继承时的区别。
* public:类之外都可以访问,公开程度最高。子类可以直接继承和访问。
*protected:默认的级别,只有在父类和子类、分类中可以拥有、访问。
*private: 私有的。只有父类可以直接访问。子类可以继承拥有该属性,但是子类的方法中不能直接访问该属性,需要调用父类方法来访问属性。


  1. // 父类Person的声明文件
  2. #import <Foundation/Foundation.h>


  3. @interface Person : NSObject
  4. {
  5.         // public 就不举例了
  6.         @protected
  7.         int _age;
  8.         @private                    
  9.         NSString *_name;
  10. }
  11. @property int age;
  12. @property NSString *name;
  13. @end


  14. // 子类Student的声明文件
  15. #import "Person.h"
  16. @interface Student : Person


  17. - (void)setAge:(int)age; //正确,_age是protected,子类可以直接访问,重写方法可以
  18. - (void)setName:(NSString *name);  // 错误,_name是父类私有的,只能通过父类的方法访问该属性,不能在子类方法中直接访问

  19. @end
  20. int main()
  21. {
  22.         Student *s = [[Student alloc] init];
  23.         s.age = 10;
  24.         s.name = @"Jack"; // 这个是可以的,因为调用的赋值方法是父类的赋值方法
  25.         return 0;
  26. }
复制代码

2、继承的优势:
1)可以避免重复写一样的代码。(因此,当A类基本包括B类中所有的方法和属性时,就让B类作父类,比如A类是猫,B类是动物;或者A类和B类有很多一样的方法和属性时,可以把这些属性方法抽出,定义成C类,让A、B一起继承C类。比如A类是猫,B类是狗,那么可以抽取一样的作C类动物)
2)建立了类之间的联系。
3)子类可以直接继承父类的属性和方法,并且调用。private除外

缺点就是耦合性太强,往往改动一个父类,会引起很多子类、分类的变化。

3、继承的使用的注意:
1)子类可以重写父类的方法,但是private属性除外。代码运行时,会先到子类中找方法,找不到会向上一级父类中找,依次类推,直到找到根类。
2)子类中不可以有与父类相同的变量名。

4、当一个类完全拥有另外一个类作为其属性时,可以使用组合。假设有一个Book类,一个Student类。若每个学生都有一本书作为其属性,那么学生属性的声明可以使用组合。
@interface Student :NSObject
{
        Book *_book;
}
@end
5、在子类的方法中,可以使用super,直接调用上一层父类的方法。假设父类动物类,有吃的方法,使体重加一。
- (void)eat
{
        _weight += 1;
}
子类狗中,也有吃的方法,不仅吃完体重加一,还会叫两声;
- (void)eat
{
        [super eat];
        NSLog(@"叫两声");
}
作者: Errors    时间: 2015-3-25 21:46
还有一点,默认情况下,成员变量都是protected的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2