黑马程序员--类的三大特性(多态、继承、封装)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

/*
多态
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数或方法变量参数中使用的是父类类型,可以传入父类、子类对象
4.局限性:
1》父类类型的变量 不能 直接调用子类特有的方法,必须强转为子类类型变量后,才能直接访问子类特有的方法

*/

#import <Foundation/Foundation.h>


@interface Animal : NSObject

- (void)eat;

@end

@implementation Animal

- (void)eat
{
    NSLog(@"吃东西----");
}

@end

@interface Dog : Animal

@end

@implementation Dog
- (void)eat
{
    NSLog(@"Dog吃东西----");

}
@end
int main()
{
    Dog *d = [Dog new];//dog 类型
    // 多态:父类指针指向子类对象
    Animal *a = [Dog new];
    //多态的局限性:父类类型的变量 不能用来调用子类的方法
    Dog *dd = (Dog *)aa;//int a = (int)1.09 强制转换
    [a eat];    //调用的是Dog里面的方法 eat,但不能这么用

    return 0;
}

/*
继承的适用场合
1》当两个类拥有相同的属性和方法的时候,就可以将相同的东西抽取到一个父类中
2》当A类完全拥有B类部分属性和方法是,可以考虑让B类继承A类(不一定)
****student 可以继承 person student和score 只能组合
例如:

@interface Student : NSObject
 {
    Score *_score;
    int _age;               //[super walk]调用父类方法walk
 }                          super作用:直接调用父类中的某个方       法和self想似

继承的好处:
1》抽取重复代码
2》简历了类之间的关系
3》子类可以拥有父类中的所有成员变量和方法
2.注意点
1》基本上所有的根类是NSObject
*不允许子类和父类有相同的成员变量(方法可以一样)
*父类必须声明在子类的前面
*就近原则
坏处
耦合性:之间联系太强
*/

#import <Foundation/Foundation.h>

//****Animal的声明******
@interface Animal : NSObject
{
    int _age;
    double _weight;
}

- (void)setAge:(int)age;
- (int)age;

- (double)setWeight:(double)weight;
- (double)weight;

@end
//Animal的实现********************
@implementation Animal

- (void)setAge
{
    _age = age;
}
- (int)age
{
    return _age;
}
- (double)setWeight:(double)weight
{
    _weight = weight;
}
- (double)weight
{
    return _weight;
}

@end
//********Dog*******
//: Animal 继承了Animal,相当于拥有了Animal里面的所有的成员变量和方法
// Animal称为Dog的父类
// Dog称为Animal的子类
@interface Dog :Animal
@end

@implementation Dog


@end
//******CAT*********8
@interface Cat :Animal
@end

@implementation CAT

@end
int main()
{
    Dog *d = [Dog new];
    [d setAge:10];
    NSLog(@"age=%d", [d age]);

    return 0;
}

封装

#import <Foundation/Foundation.h>

@interface Student : NSObject//只允许外界访问,不允许修改 值提供get方法
{   //成员变量尽量不要使用@public
    // @public
    int _age;成员变量的命名规范:一定要以下划线 _ 开头
}
/*set 方法
 1.作用:提供一个方法给外界设置成员变量值
 2.命名规范:
 1》方法名必须以set开头
 2》set 后面跟上成员变量的名称,成员首字母必须大写
 3》返回值一定是void
 4》一定要接受一个参数,而且参数类型一定要跟成员变量一致
 5》形参的名称不能与成员变量名一样
 */
- (void)setAge:(int)Age;

- (void)study;
/*get方法
 1.作用:返回对象内部的成员变量
 2命名规范:
 1》肯定又返回值,返回值肯定与成员变量类型一致
 2》方法名与成员变量名一样
 3.》不需要接受任何参数
 */
- (int)age;

@end

@implementation Student
//set方法的实现
- (void)setAge:(int)newAge
{
    //对传进来的参数进行过滤
    if (Age <= 0)
    {
        Age = 1;
    }
    _age = Age;
}


- (void)study
{
    NSLog(@"%d岁的学生在学习",age);
}
- (int)age
{
    return _age;
}
@end
int main()
{
    Student *stu = [Student new];
    [stu setAge:10];
    //[stu study];
    NSLog(@"学生的年龄是%d岁",[stu age]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值