OC基础之访问修饰符
做C#、Java的人都知道private、protect、public这些访问权限,在OC中看项目基本都没用到这些,昨天就好奇的仔细了解了下,其实OC中也是有这些访问权限的修饰。说实话有好多做过编程的也未必对这些基础知识了解。
1.分清属性和变量的区别
属性是对变量的封装,可以通过属性(get\set)方法来访问变量。例如有一些变量(例如年龄、性别等)在赋值或取值要满足一些条件,那如何解决呢? 于是属性就应运而生,用它的get、set方法来解决这个问题 ,这也是面向对象中封装的体现。
2.private、protect、public访问权限修饰符
这些修饰符可以对变量、属性、方法进行修饰。为什么会出现这些修饰符呢?比如一些信息是隐私的不希望被外部访问或者访问也只能它家族里可以访问,所以权限修饰符应运而生。
3.OC中的private、protect、public访问权限修饰符
看别人的项目包括自己的项目都没有对属性、方法、变量的修饰符。其实oc中也是有这些的,只是不常用或者根本甚至根本没用过。
属性访问权限
protected 该类和所有的子类中的方法可以直接访问这样的变量,这是默认的。
private 该类中的方法可以访问这样的变量,子类不可以 可以将变量放在.m中
public 除了自己和子类中的方法外,也可以被其他类或者其他模块中的方法所访问。开放性最大。
package 框架集中
方法访问权限
只有public、private public .h文件 private .m中
4.代码demo
下面定义了一个父类Student,子类OldStudent继承父类Student。
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
int age; //年龄 默认protect
@public
int no; // 学号
@protected
float height; // 身高
@private
float weight; // 体重
}
//@property @synthesize
@property(nonatomic,assign,readwrite) int No;
@property(nonatomic,assign,readwrite) float Weight;
@property(nonatomic,assign,readwrite) float Height;
//get/set方法
-(void)setAge:(int)newAge;
-(int) Age;
-(void) eat;
@end
#import "Student.h"
#import <objc/runtime.h>
@implementation Student
@synthesize Weight=weight,Height=height;
-(void)setAge:(int)newAge
{
if (age!=newAge) {
age=newAge;
}
}
-(int) Age
{
return age;
}
-(void) eat
{
NSLog(@"eat");
[self goToSchool];
}
-(void) goToSchool
{
NSLog(@"goToSchool");
}
@end
#import "Student.h" @interface OldStudent : Student @property (nonatomic,strong) NSString *Major;//专业 @end
#import "OldStudent.h"
@implementation OldStudent
- (instancetype)init
{
self = [super init];
if (self) {
height=172.0; //protect
no=; //public
age=; //protect
_Major=@"计算机"; //默认 protect
}
return self;
}
-(void)eat
{
NSLog(@"eat.......");
}
@end
在上面OldStudent中并不能直接访问Student中的Weight。
#import <Foundation/Foundation.h>
#import "Student.h"
#import "OldStudent.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *student=[[Student alloc]init];
//访问变量
student->no=;
//访问属性
student.Age=;
student.Height=170.0;
student.Weight=170.0;
[student eat];
NSLog(@"Age=%d No=%d",student.Age,student->no);
OldStudent *oldStudent=[[OldStudent alloc]init];
oldStudent->no=;
// oldStudent->age=24; //protect 子类不能继承 只能通过父类get/set方法
oldStudent.Age=;
oldStudent.Weight=200.0;
oldStudent.Major=@"软件"; //默认是protect
[oldStudent eat];
NSLog(@"Age=%d No=%d",oldStudent.Age,oldStudent->no);
}
;
}
上面的代码中看到可以通过类似C++中->来访问变量。OldStudent不能直接访问age变量,可以通过属性来访问。
这篇主要理解继承封装,对于多态,oc中的多态和C#的还不太一样,oc是没有编译时多态,是通过消息转发来完成,之前博客也有写。
OC基础之访问修饰符的更多相关文章
- C# 基础(一) 访问修饰符、ref与out、标志枚举等等
C# 基础(一) 访问修饰符.ref与out.标志枚举等等 一.访问修饰符 在C#中的访问修饰符有:private.protected.internal.public public:公共类型,同一程序 ...
- Java基础——protected访问修饰符探讨
Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...
- C#基础之访问修饰符
C#访问修饰符,无时无刻都在使用,这里记录一下,如果写错的地方,欢迎指正. public :公有的,任何代码均可以访问,应用于所有类或成员: internal:内部的,只能在当前程序集中使用,应用于所 ...
- (C# 基础) 类访问修饰符
C# 中有5个权限修饰符,用于控制对对象的访问权限. 1. public: 访问不受限制. namespace, enum成员,interface成员 隐式的具有public 修饰符,不能在显式添 ...
- C#基础回顾(一)—C#访问修饰符
一.写在前面的话 好久没有停下来总结自己,转眼间15年过去好些天,回首过去的日子,亦或失去,亦或所得!生活的节奏,常常让我们带着急急忙忙的节奏去追赶,也许这并不是每个人所期望的生活方式!于他人,于自己 ...
- [.net基础]访问修饰符
标题:[.net基础]访问修饰符 一.前言 基础掌握不牢固啊,所以记录下来. 二.方法访问修饰符Internal (1).创建工程ParentAndSon (2).添加类ModelA namespac ...
- 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)
1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...
- C#基础知识八之访问修饰符
1. 类的访问修饰符 修饰符 访问权限 无或者internal 只能在同一个程序集中访问类 public 同一个程序集或引用该程序集的外部都可访问类 abstract或internal abstra ...
- .NET 基础 一步步 一幕幕 [注释、命名规则、访问修饰符、数据类型、常量、变量]
注释.命名规则.访问修饰符.数据类型.常量.变量 话说一个不会写注释的程序猿的不是一个好吃货,我们本篇就从注释开始说起好了. 在C#中有三种注释: 第一种:单行注释 以//开头,后面的就是注释内容 ...
随机推荐
- sql 存储过程带有模糊查询条件
一个简单的存储过程: Create procedure [dbo].[Proc_SeachJob] (@startRecordIndex int, @endRecordIndex int, @seac ...
- C#中==操作符存在的缺陷
==操作符因为语法简洁而备受欢迎,但它本身也存在着局限性,比如继承或泛型问题.下面让我们依次来看看吧. 1.==和继承性问题 关于==运算符在继承时存在的问题,我们以String类型为例进行说明. s ...
- NET Core 拓展方法和中间件集合(支持NET Core2.0+)
# Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...
- P4016 负载平衡问题 网络流
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运 ...
- 【文文殿下】【HAOI2008】硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 数据规模 di,s<=1 ...
- 自定义JSON返回字段
今天看到一篇文章,里面介绍了如何自定义返回json字段,感觉挺好用的,这里学习一下. 实现工具类: /** * @author fengzp * @date 17/2/20上午10:34 * @ema ...
- Java 设计模式——单例模式
Java有很多的设计模式,但是让我们一个个分析出来,可能就一脸蒙逼了,今天就和大家一块来分析一下Java中的一些常用的设计模式.今天先分析单例模式 单例模式的好处 举个例子:有一个类,里面有若干个公共 ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- 在 Go 语言中使用 Log 包--转自GCTT
Linux 在许多方面相对于 Windows 来说都是独特的,在 Linux 中编写程序也不例外.标准输出,标准 err 和 null devices 的使用不仅是一个好主意,也是一个原则.如果您的程 ...
- datetime之 utcnow 和now的用法
from datetime import datetime print(datetime.now()) 本地时间 print(datetime.utcnow()) 国际时间