封裝,繼承,多態(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