做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基础之访问修饰符的更多相关文章

  1. C# 基础(一) 访问修饰符、ref与out、标志枚举等等

    C# 基础(一) 访问修饰符.ref与out.标志枚举等等 一.访问修饰符 在C#中的访问修饰符有:private.protected.internal.public public:公共类型,同一程序 ...

  2. Java基础——protected访问修饰符探讨

    Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...

  3. C#基础之访问修饰符

    C#访问修饰符,无时无刻都在使用,这里记录一下,如果写错的地方,欢迎指正. public :公有的,任何代码均可以访问,应用于所有类或成员: internal:内部的,只能在当前程序集中使用,应用于所 ...

  4. (C# 基础) 类访问修饰符

    C# 中有5个权限修饰符,用于控制对对象的访问权限. 1. public:   访问不受限制. namespace, enum成员,interface成员 隐式的具有public 修饰符,不能在显式添 ...

  5. C#基础回顾(一)—C#访问修饰符

    一.写在前面的话 好久没有停下来总结自己,转眼间15年过去好些天,回首过去的日子,亦或失去,亦或所得!生活的节奏,常常让我们带着急急忙忙的节奏去追赶,也许这并不是每个人所期望的生活方式!于他人,于自己 ...

  6. [.net基础]访问修饰符

    标题:[.net基础]访问修饰符 一.前言 基础掌握不牢固啊,所以记录下来. 二.方法访问修饰符Internal (1).创建工程ParentAndSon (2).添加类ModelA namespac ...

  7. 20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

    1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. ...

  8. C#基础知识八之访问修饰符

    1.  类的访问修饰符 修饰符 访问权限 无或者internal 只能在同一个程序集中访问类 public 同一个程序集或引用该程序集的外部都可访问类 abstract或internal abstra ...

  9. .NET 基础 一步步 一幕幕 [注释、命名规则、访问修饰符、数据类型、常量、变量]

    注释.命名规则.访问修饰符.数据类型.常量.变量 话说一个不会写注释的程序猿的不是一个好吃货,我们本篇就从注释开始说起好了. 在C#中有三种注释: 第一种:单行注释  以//开头,后面的就是注释内容 ...

随机推荐

  1. linq与数据库之添加

    这个是linq的添加显示 代码如下: //添加 private void button2_Click(object sender, EventArgs e) { string strstu = &qu ...

  2. 使用Emit实现给实体赋值

    Dapper.net的速度很快,最近看源码,原来他orm的实现是通过编写大量IL代码实现的. 使用DynamicMethod,自己编织一个给实体赋值的方法.这种写法效率很高,接近直接对属性赋值.比使用 ...

  3. WP8.1StoreApp(WP8.1RT)---MessageBox与MessageDialog

    在WP7和WP8中,MessageBox是跟WinForm中一样常用的对话框,但是有一个显著的缺点,就是WP7/8中默认的MessageBox是阻塞线程的.也许是由于这个原因,WP8.1/Win8中采 ...

  4. UWP开发入门(三)——{x:Bind}扩展标记

    上周打炉石打得太晚……忘记更新了,本周补上.本篇我们讲一下{x:Bind}扩展标记.{x:Bind}扩展标记也是Windows 10 Uinversal 新增的内容,按官方的说法是 {Binding} ...

  5. 【题解】 BZOJ4548 小奇的糖果

    本文同步在学弟ZCDHJ的个人博客发布,审核需要一段时间. 传送门 考虑题目中获得的糖果并不包含所有的颜色这句话,发现相当于我们可以直接选取某一个颜色强制不能选(这样子一定最优). 然后就可以考虑分开 ...

  6. Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]

    原文链接:http://www.cnblogs.com/sammyliu/p/4843812.html?utm_source=tuicool&utm_medium=referral 1 Poo ...

  7. Javascript中的名词

    BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM (Document Object Model ...

  8. iOS开发网络篇—GET请求和POST请求的说明与比较

    1.GET请求和POST请求简单说明 1.1 创建GET请求 // 1.设置请求路径 NSString *urlStr = [NSString stringWithFormat:@"http ...

  9. 比较有用的php代码片段

    一 从网页中提取关键词 $meta = get_meta_tags('http://www.emoticode.net/'); $keywords = $meta['keywords']; // Sp ...

  10. 十二生肖查询网页版制作(php)

    今天无聊做了一个十二生肖查询器: 预览网址效果:http://hongxing01.hktd02u.me48.com/03Sxcx 源代码下载:http://down.51cto.com/data/1 ...