Object-C 面向对象基础

时间:2021-08-29 17:21:49

一,定义类

Object-C中定义类需要两个步骤:

1,接口部分:定义该类包含的成员变量与成员方法

2,实现部分:为该类的方法提供实现。

下面是接口部分的声明

#import <Foundation/Foundation.h>

@interface Student : NSObject{
NSString *_name;
int _age;
}

- (id)initWithString:(NSString *)name age:(int)age;
- (void)display;

@end
注意:

1,Object-C建议成员变量名以下划线(_)开头。

2,方法的类型标识符:"+"表示该方法是类方法,"-"表示该方法是成员方法。

3,Object-C的成员变量都是实例变量,Object-C并不支持真正的类变量。

3,除第一个形参外,Object-C建议为后面的每个形参指定一个形参标签,这个形参标签能很好的说明该形参的作用。

4,在Object-C的方法声明中,所有的类型(包括void)都应该使用圆括号括起来,这是Object-C方法与C++函数的区别之处。


下面是类的实现部分

#import "Student.h"

@implementation Student{
NSString *_number;
int _gender;
}

- (id)initWithString:(NSString *)name age:(int)age{
if(self = [super init]){

}
return self;
}

- (void)display{

}

- (void)Func{

}
注意:

1,类的实现部分,必须实现在接口中声明的所有方法。

2,类的实现部分也可以声明自己的成员变量,但这些成员变量只能在当前的类内访问,这相当于类的隐藏的成员变量。

3,在类的实现部分可以声明自己的方法,但这些方法只能在当前的类内访问。


二,创建类对象

无论是创建哪个类的对象,最先被调用的是该类的alloc类方法来分配内存,这个alloc方法是在NSObject类中声明的,而所有的Object-C类都是NSObject的子类,因此所有的类都可以使用alloc方法来分配内存。分配完内存要对对象进行初始化,Object-C最常用的初始化方法是init方法,该方法同样是来自NSObject。下面的代码是创建一个Student类对象

Student *p = [[Student alloc] init];
p->name = @"zhangsan";
[p display];

通过对象访问成员变量的语法格式

对象->成员变量,例如:p->name = @"zhangsan";

通过对象访问成员方法的语法格式

[对象  成员方法],例如:[p  display];


三,隐藏与封装

Object-C提供了四个访问控制符,@public、@private、@protected、@package,在类的接口部分声明的成员变量的默认访问权限是@protected。使用访问控制符应注意的问题

注意:

1,Object-C中的访问控制符只能用来修饰成员变量,不能修饰成员方法与属性。

2,不能在访问控制符后面加":",下面是错误的写法

@interface Student : NSObject{
@private:
NSString *_name;
int _age;
}


四,继承

1,继承的实现

Object-C中的继承通过": 父类"语法来实现,下面是一个具体的实例:

@interface Student : NSObject{
NSString *_name;
int _age;
}

当子类继承父类时,子类可以获取父类的如下东西

1,全部成员变量。

2,全部方法(包括初始化方法)。


2,super关键字

使用super关键字访问父类中被覆盖的方法

- (id)initWithString:(NSString *)name age:(int)age{
if(self = [super init]){

}
return self;
}

 

五,多态

下面声明两个类,一个父类Base,一个子类Derived

//定义父类Base
@interface Base : NSObject
- (void)test;
@end

@implementation Student
- (void)test{
NSLog(@"Base test");
}
@end

//定义子类Derived
@interface Derived : Base
- (void)test;
@end

@implementation Derived
- (void)test{
NSLog(@"Derived test");
}
@end

多态的实现

Base *p = [[Base alloc] init];
//调用的是Base::test
[p test];

p = [[Derived alloc] init];
//调用的是Derived::test
[p test];
子类是一种特殊的父类,因此,Object-C允许把一个子类对象直接赋值给一个父类指针变量,无需任何类型转换,称之为向上类型转换。