OC基礎(chǔ)-面向?qū)ο蟮娜筇卣?四)

封裝,繼承,多態(tài)

封裝

  • 1.首先,不能使用@public。因?yàn)橐坏┦褂聾public就意味著外界可以直接訪問對(duì)象的這個(gè)屬性,外界一旦可以直接訪問這個(gè)屬性就可以任意的為這個(gè)屬性賦值,所以必須要將這個(gè)功能關(guān)掉。
  • 2.為類提供一個(gè)方法,這個(gè)方法專門為這個(gè)屬性賦值。這個(gè)方法我們叫做setter。
  • 3.去掉了@public我們?cè)趍ain函數(shù)中就無法直接讀取對(duì)象的屬性值了.所以, 需要再寫一個(gè)方法,專門用來返回屬性的值。這個(gè)方法我們叫做getter。
@interface Person : NSObject
{
//不能使用@public
    NSString *_name;
    int _age;
}
//setter
-(void)setName:(NSString *)name;
-(void)setAge:(int)age;
//getter
-(NSString *)name;
-(int)age;
@end
@implementation Person
//setter
-(void)setName:(NSString *)name
{
    NSUInteger len = [name length];
    if (len >= 2)
    {
        _name = name;
    }
    else
    {
        _name = @"無名";
    }
}
-(void)setAge:(int)age
{
    if (age >= 0 && age <= 150)
    {
        _age = age;
    }
    else
    {
        _age = 18;
    }
}
//getter
-(NSString *)name
{
    return _name;
}
-(int)age
{
    return _age;
}
@end

這樣 我們就可以使用點(diǎn) "." 語(yǔ)法了

int main(int argc, const char * argv[])
{
    Person *p = [[Person alloc]init];
    p.age = 11;
    p.name = @"張三";
    NSLog(@"姓名:%@===年齡:%d",p.name,p.age);
 return 0;
}
// 姓名:張三===年齡:11

繼承

@interface 類名 : 父類的名字

@end

@implementation 類名

@end
繼承的特點(diǎn):
  • 單根性
    即一個(gè)類只能有一個(gè)父類,不能有多個(gè)父類。
  • 傳遞性
    A類從B類繼承,B類從C類繼承,那么A類就同時(shí)擁有B和C類所有的屬性和行為。
NSObject類:

我們前面一直在使用的NSObject其實(shí)也是一個(gè)類,它是Foundation框架中的類,在這個(gè)類中有一個(gè)類方法叫做new,這個(gè)方法是用來創(chuàng)建對(duì)象的。這個(gè)方法的返回值是創(chuàng)建的這個(gè)對(duì)象的指針。
也就是說,如果要?jiǎng)?chuàng)建類的對(duì)象,就必須要調(diào)用這個(gè)new方法。也就是說我們必須直接的或者間接的從NSObject類繼承。
另外,NSObject類之中還定義了一個(gè)屬性,這個(gè)屬性叫做isa指針,所以每一個(gè)子類對(duì)象中都有一個(gè)叫做isa的指針。
綜上所述,NSObject類是OC所有類的父類,因?yàn)镺C中的類全部都是直接或者間接的從它繼承而來。

多態(tài)

多態(tài)指的是同一個(gè)行為對(duì)于不同的事物具有完全不同的表現(xiàn)形式。

#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
 @public
 NSString *_name;
 NSString *_color;
 float _weight;
}
-(void)selfIntroduction:(NSString*)msg;//自我介紹
@end

@implementation Animal

- (void)selfIntroduction:(NSString*)msg{
    NSLog(@"我叫%@ 毛色:%@ 重量:%fkg 我會(huì)叫%@",_name,_color,_weight,msg);
}

@end

@interface Cat : Animal
-(void)climb;
@end

@implementation Cat
- (void)selfIntroduction:(NSString *)msg{
    NSLog(@"我只是一只貓貓,我只會(huì)%@",msg);
}
- (void)climb{
    NSLog(@"貓咪會(huì)爬樹");
}
@end

int main(int argc, const char * argv[])
{
 @autoreleasepool
 {
     Animal *animal = [Animal new];
     animal->_name = @"小花貓";
     animal->_color = @"黃色";
     animal->_weight = 2.0;
     [animal selfIntroduction:@"喵喵喵"];
     
     Cat *cat = [Cat new];
     cat->_name = @"小白貓";
     cat->_color = @"白色";
     cat->_weight = 1.0;
     [cat selfIntroduction:@"喵喵喵"];
     [cat climb];

     
 }
 return 0;
}

總結(jié)例子


image.png
#import <Foundation/Foundation.h>
#import "Eyes.h"
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[])
{
    Student *obj = [Student new];
    obj->_age = 1;
    Eyes *eyes = [Eyes new];
    eyes->_num = 2;
    obj->eyes = eyes;
    NSLog(@"學(xué)生眼睛個(gè)數(shù)%d",obj->eyes->_num);
    [obj run];

 return 0;
}
//2021-07-28 16:32:22.875811+0800 TestOc[48875:443904] 學(xué)生眼睛個(gè)數(shù)2
//2021-07-28 16:32:22.876116+0800 TestOc[48875:443904] 學(xué)生會(huì)跑

Eyes.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Eyes : NSObject{
@public
int _num;
}

@end

NS_ASSUME_NONNULL_END

Eyes.m

#import "Eyes.h"

@implementation Eyes

@end

Person.h

#import <Foundation/Foundation.h>
#import "Eyes.h"
NS_ASSUME_NONNULL_BEGIN

@interface Person : NSObject{
@public
int _age;
Eyes *eyes;
}
-(void)run;

@end

NS_ASSUME_NONNULL_END

Person.m

#import "Person.h"

@implementation Person
- (void)run{
    NSLog(@"人會(huì)跑");
}
@end

Student.h

#import "Person.h"

NS_ASSUME_NONNULL_BEGIN

@interface Student : Person
{
    @public
    int _no;
}
@end

NS_ASSUME_NONNULL_END

Student.m

#import "Student.h"

@implementation Student
- (void)run{
    NSLog(@"學(xué)生會(huì)跑");
}
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容