OC基础-面向对象思想08

1. 面向对象的三大特征是什么?


     封装


         封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是包装。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。


         好处:使用更简单变量更安全可以隐藏内部实现细节开发速度加快


    继承

        面向对象编程(OOP)语言的一个主要功能就是继承。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

        继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是属于关系。

        OC中一个类可以继承另一个类,被继承的类成为超类(superclass),继承的类是子类(childclass),可以直接拥有父类中所有非私有成员(相关实例变量)、方法。继承的实现在接口中使用符号

        举个例子:@interfaceStudent:NSObject{}不过大家要注意的是:属性封装实例变量,方法封装具体实现代码,类封装属性和方法。子类可继承父类中的方法,还可重写父类方法。


    多态


        多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。

        实现多态,有二种方式,覆盖,重载。

        1)覆盖:是指子类重新定义父类的虚函数的做法。

        2)重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同


    封装可隐藏实现细节,,使代码模块化;继承可扩展已存在的代码模块(类);它们最终需要的结果(代码重用)。多态是为了实现另一个目的(接口重用)。多态的作用,就是为了类在继承和派生的时候,保证使用家谱中任一类的实例的某一属性时的正确调用。


2. 存在的问题.


    就是为对象的属性赋值的时候语法上其实只要数据的类型是属性的类型就是可以的.

    但是,情理上这么做是不合适的.


    就像Person对象有1int类型的属性_age表示1个人的年龄.

    为这个对象的_age属性赋值的时候其实只要是int类型的数据语法上都是完全可以的.

    但是1个人的年龄正常情况下是在 0-200之间的.


    解决的问题:

    在为对象的属性赋值的时候,我希望将这个数据做1个逻辑验证.

    如果为属性赋的值在这个逻辑范围之内那么我们就把这个值赋值给属性.否则我们就做默认处理.


    就像我们希望为Person对象的_age属性赋值的时候,要判断1下为_age属性赋的值是不是在0-200之内.

    否则我们就做默认处理.



3.如何实现这个需求


    1). 将属性的@public去掉.因为一旦写上@public就意味着外界可以直接访问对象的这个属性.

    外界一旦可以直接访问这个属性那么外界就可以任意的为这个属性赋值这个时候你拦都拦不住.


    去掉@public外界就无法直接访问这个属性也就无法赋值了.



    2). 为类提供1个方法,这个方法专门为这个属性赋值.这个方法我们叫做setter


    a. 这个方法一定是1个对象方法因为这个要为属性赋值.

    b. 这个方法没有返回值.因为这个方法做的事情仅仅是为属性赋值就可以了.

    c. 这个方法的名称必须以set开头.跟上去掉下划线首字母大写的属性名.

    d. 这个方法一定是有参数的.参数的类型和属性的类型一致.参数的名称和属性的名称一致(去掉下划线)

    e. 在方法的实现中,判断传入的数据是否符合逻辑.如果符合逻辑则赋值否则做默认处理.

    f. 外界想要为对象的属性赋值那么就调用这个对象的setter方法将要赋值的数据传入给这个方法.

    方法会对这个数据进行验证如果符合验证就会吧数据赋值给属性否则就会做默认处理.






4. 注意


    1). 属性的@public修饰符没有去掉.如果没有去掉就算你的getter setter封装的再牛X也不会掉用.


    2). 搞不清楚对象.判断参数的值富是否符合逻辑将参数赋值给属性.



    3). getter setter 方法名极度不规范.




5. 什么时候需要为属性封装settergetter



    1). 只要属性需要被外界访问.就要为这个属性封装settergetter

        哪怕在赋值或者取值的时候没有任何逻辑验证.


    2). 如果属性只在类的内部访问.那么就不需要为其封装getter setter



6. 只读封装与只写封装.


    只读封装:为属性封装的时候只提供getter不提供setter

    只写封装:为属性封装的时候.只提供setter不提供getter


你可能感兴趣的:(Objective-C)