继承和类设计

==========================

==========================

oc是一门面向对象的语言,面向对象编程有三大特性:封装、继承、多态

一.封装

【注】封装就是把某些解决一些问题的代码进行模块化,对外部暴露一个接口。我们都称为封装了一个方法;

【优点】

1.封装可以增强代码的复用度。

2.封装可以有效提高开发速度。

二.继承

子类拥有了父类的方法和属性的情况,我们称为继承;

A:B(读作:A类继承B类,也就A类拥有了B类的方法和属性)

【优点】

1.不用书写任何代码,就可以实现某一些功能;

2.可以不用修改父类的方法,对父类进行扩展;

三.多态

多态:类的多种形态

【总结】

多态的方式,可以有效的缩减代码量

多态多用在具有相同方法名的类中,外部在调用方法之前,并不清楚需要调用哪个类中方法;

四.类别(category)(扩展)

有一些第三方类、咱们程序员以前自己写的一些类,要用到的时候突然发现如果这个类能有一个xxx方法那就好了,但是又不允许对第三分类或者以前写的类进行修改。那么怎么办?就可以用到类别(扩展)

1.认识category

#import <Foundation/Foundation.h>

#import "dog.h"

// 使用类别的时候需要先包含头文件

// 类别一般单独放到一个类中进行扩展

#import "NSString+print.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

NSString* str = @"hello world hahah";

[str show];

NSLog(@"%@",str);

dog* mydog = [[dog alloc]init];

[mydog test];

}

return 0;

}

#import <Foundation/Foundation.h>

// NSString 就是要扩展的类 ()小括号内部就是你自己写的类名

@interface NSString (print)

//这个位置写需要扩展出来的方法

-(void)show;   // 打印当前对象

// 可以扩展成员方法,但是不可以扩展成员变量

// 【注】类别就是为了扩展第三方类或者其它以前自己写的类方法,但是又不可以对第三方和之前写的方法进行修改,而存在的;

@end

#import "NSString+print.h"

@implementation NSString (print)

-(void)show

{

//打印当前对象

NSLog(@"%@",self);

}

@end

#import <Foundation/Foundation.h>

@interface dog : NSObject

-(void)test;

@end

#import "dog.h"

#import "NSString+print.h"

@implementation dog

-(void)test

{

NSString* str = @"我是dog class";

[str show];

}

@end

继承和类别的区别

1.类别是对类的方法进行扩展,不能添加成员变量。但是继承可以在原有父类的基础上对方法和成员变量进行扩展。

2.类别只能添加新的方法,不能修改删除原类的方法,但是继承可以增加和修改;

3.类别不提倡对原有方法进行重载,但是继承可以。

4.类别可以被继承,如果父类中实现了类别,子类也就存在此类别。

2.认识extension(扩展)也是类别的一种;

【知识扩展】

1.声明在.h中的方法或者属性变量,外界可以访问;

2.声明在.m中的属性变量或者方法,只是当前类可以访问;

时间: 2024-10-12 10:36:50

继承和类设计的相关文章

类设计中几种继承方式

 通过继承能够从已有的类派生出新的类,而派生类继承了基类的特征,包括方法.正如继承一笔财产要比自己白手起家容易一样,通过继承派生出的类通常比设计新类要容易得多.下面是可以通过继承完成的一些工作. ①可以在已有类的基础上添加功能. ②可以给类添加数据. ③可以修改类方法的行为. C++有三种继承方式:公有继承.保护继承和私有继承. 一.公有继承 公有继承是最常用的方式,它建立一种is-a关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行. ①公有继承不建立

面向对象【day07】:类的属性-继承-经典类

本节内容 类的公有属性 析构函数 类的继承 新式类和经典类 一.类的公有属性 一.概述 前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人觉的,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?揭起了大家的好奇心. 定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性. 二.公有属性 2.1 定义 说明:在类中直接定

Java中继承thread类与实现Runnable接口的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. Java代码   package com.threadtest; class MyThread e

【C++常识】effective C++ 使用条款——内存管理/继承和面向对象设计/杂项

第六章 继承和面向对象设计 条款35: 使公有继承体现 "是一个" 的含义 1.子类对象一定"是一个"基类对象,基类对象不一定是子类对象 条款36: 区分接口继承和实现继承 1.希望派生类只继承成员函数的接口--将函数声明为纯虚函数 2.希望派生类同时继承函数的接口和实现,但允许派生类改写实现--将函数声明为虚函数 3.希望同时继承接口和实现,并且不允许派生类改写任何东西--声明为非虚函数 条款37: 决不要重新定义继承而来的非虚函数 1.基类声明为非虚的函数表示这

Effective C++笔记06:继承与面向对象设计

关于OOP 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private,也可以是virtual或non-virtual. 2,成员函数的各个选项:virtual或non-virtual或pure-virtual. 3,成员函数和其他语言特性的交互影响:缺省参数值与virtual函数有什么交互影响?继承如何影响C++的名称查找规则?设计选项有如些?如果class的行为

Effective C++ 6.继承与面向对象设计

//条款32:确定你的public继承塑模出is-a关系 // 1.public继承意味着is-a的关系,适用在基类上的方法都能用于派生类上. //条款33:避免遮掩继承而来的名称 // 1.在public继承体系中,派生类和基类的关系是is-a的关系,所以派生类中不应该隐藏基类的非虚函数. // 2.为了在派生类中重载基类的非虚函数,可以使用using声明式,或者在派生类的函数中显示调用基类的非虚函数. //条款34:区分接口继承和实现继承 // 1.接口继承与实现继承不同.在public继承

【Java面试题】13 Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

1.什么是匿名内部类? 内部类,存在于另一个类内部的类,而匿名内部类,顾名思义,就是没有名字的内部类. 2.为什么需要匿名内部类? 每个inner class都能够各自继承某一实现类(implementation).因此,inner class不受限于outer class是否已继承自某一实现类. 如果少了inner class所提供的"继承自多个具象(concrete)或抽象(abstract)类"的能力,设计上和编程上的某些问题会变得十分棘手. 所以,从某个角度来看inner cl

【多线程学习记录一(2)】继承Thread类和实现Runnable接口、Callable接口的区别

1)Runnable和Callable同是接口 * Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void);call方法可以抛出异常,run方法不可以 * 运行Callable任务可以拿到一个Future对象,表示异步计算的结果.它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果. * 加入线程池运行,Runnable使用ExecutorService的execute方

Effective C++ -- 继承和面向对象设计

32.确保你的public继承了模is-a关系 public继承意味着is-a关系(里氏替换原则),一切适用于基类也适用于派生类. 矩形继承正方形问题: 可实施与矩形的操作无法实施与正方形 在编程领域.正方形是一种矩形是错误的 在现实领域,正方形是一种矩形是正确的 33.避免遮盖继承而来的名称 class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2()