封裝,繼承,多態(tài)
封裝
- 1.首先,不能使用@public。因為一旦使用@public就意味著外界可以直接訪問對象的這個屬性,外界一旦可以直接訪問這個屬性就可以任意的為這個屬性賦值,所以必須要將這個功能關(guān)掉。
- 2.為類提供一個方法,這個方法專門為這個屬性賦值。這個方法我們叫做setter。
- 3.去掉了@public我們在main函數(shù)中就無法直接讀取對象的屬性值了.所以, 需要再寫一個方法,專門用來返回屬性的值。這個方法我們叫做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
這樣 我們就可以使用點 "." 語法了
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
繼承的特點:
- 單根性
即一個類只能有一個父類,不能有多個父類。 - 傳遞性
A類從B類繼承,B類從C類繼承,那么A類就同時擁有B和C類所有的屬性和行為。
NSObject類:
我們前面一直在使用的NSObject其實也是一個類,它是Foundation框架中的類,在這個類中有一個類方法叫做new,這個方法是用來創(chuàng)建對象的。這個方法的返回值是創(chuàng)建的這個對象的指針。
也就是說,如果要創(chuàng)建類的對象,就必須要調(diào)用這個new方法。也就是說我們必須直接的或者間接的從NSObject類繼承。
另外,NSObject類之中還定義了一個屬性,這個屬性叫做isa指針,所以每一個子類對象中都有一個叫做isa的指針。
綜上所述,NSObject類是OC所有類的父類,因為OC中的類全部都是直接或者間接的從它繼承而來。
多態(tài)
多態(tài)指的是同一個行為對于不同的事物具有完全不同的表現(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 我會叫%@",_name,_color,_weight,msg);
}
@end
@interface Cat : Animal
-(void)climb;
@end
@implementation Cat
- (void)selfIntroduction:(NSString *)msg{
NSLog(@"我只是一只貓貓,我只會%@",msg);
}
- (void)climb{
NSLog(@"貓咪會爬樹");
}
@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é)生眼睛個數(shù)%d",obj->eyes->_num);
[obj run];
return 0;
}
//2021-07-28 16:32:22.875811+0800 TestOc[48875:443904] 學(xué)生眼睛個數(shù)2
//2021-07-28 16:32:22.876116+0800 TestOc[48875:443904] 學(xué)生會跑
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(@"人會跑");
}
@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é)生會跑");
}
@end