开闭原则与里氏替换原则
来源:互联网 发布:轩辕剑修罗进阶数据 编辑:程序博客网 时间:2024/05/16 16:05
1.开闭原则
是面向对象设计的基本原则之一,是“可复用设计”的基础,它的主要原则是:对扩展开放,对修改关闭;意思就是我们改变一个软件时。应该通过扩展方式来改变软件,而不是修改原有的代码。
2.里氏替换原则
里氏替换原则是说,任何基类可以出现的地方,子类一定可以出现(只有当衍生类可以替换基类,软件单位的功能不受到影响,基类才能真正被复用,衍生类也能够在基类的基础上增加新的行为)。
下面我们通过建一个项目,简单实现一下,假如一个学生养了两只动物,一只狗一只猫,需要进行喂食(过程中导入头文件的操作省略,方法在.h中的声明也省略,请自行添加)
1.需要建立的类有:
根视图MainViewController,负责整体的调用与测试
继承自NSobject的类Animal和继承自Animal类的子类Cat和Dog
继承自NSObject的类Student
2.在Animal类中实现一个方法:
-(void)eat{ NSLog(@"动物吃不同的东西");}
然后在其子类Cat和Dog中重写父类方法:
-(void)eat{ [super eat]; NSLog(@"猫吃鱼");}
-(void)eat{ [super eat]; NSLog(@"狗吃骨头");}
当然也要在Cat和Dog的头文件中引入-(void)eat;不然Cat和Dog实例化的对象无法调用此方法
3.如果不使用开闭和里氏替换,则要在Student类中实现两个喂养方法(导入Cat和Dog的头文件):
-(void)feedCat:(Cat*)cat{ NSLog(@"学生喂猫了"); [cat eat];}-(void)feedDog:(Dog*)dog{ NSLog(@"学生喂狗了"); [dog eat];}
4.现在在MainViewController中的viewDidLoad中调用是这样的:
Student *stu=[[Student alloc]init]; Dog *dog=[[Dog alloc]init]; Cat *cat=[[Cat alloc]init]; [stu feedCat:cat]; [stu feedDog:dog];
这种基本实现方式是可以的,也能实现,但是如果学生又喂了一只乌龟,则又需要在Student中添加给乌龟喂食的方法,这种频繁修改源代码的方式不太可取,下面我们用上开闭原则和里氏替换原则,重复3和4的步骤;
3.只需要在Student类中实现一个喂养方法(导入Animal的头文件):
-(void)feed:(Animal*)animal{ NSLog(@"学生喂动物了"); [animal eat];}4.在MainViewController中的viewDidLoad中需要这样调用:
Student *stu=[[Student alloc]init]; Animal *aCat=[[Cat alloc]init]; Animal *aDog=[[Dog alloc]init]; [stu feed:aCat]; [stu feed:aDog];
这样即使学生再喂养N只动物,Student里面的代码也不需要再去修改(满足了上面所说的开闭原则),大大减少了工作量,保持了代码的完整性;
这两行
Animal *aCat=[[Cat alloc]init];Animal *aDog=[[Dog alloc]init];
0 0
- 开闭原则与里氏替换原则
- OC循环渐进:开闭原则和里氏替换原则
- 多态与继承中的开闭原则和里氏替换原则简述
- Objective-c里氏对换原则与开闭原则
- 设计原则-里氏替换原则
- 设计原则-里氏替换原则
- 里氏替换原则
- LSP(里氏替换原则)
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- 里氏替换原则
- linux 服务器之间拷贝文件
- OA项目总结
- PAT A1056 Mice an Rice
- Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充
- 学习感悟
- 开闭原则与里氏替换原则
- 黑马程序员————@property和@synthesize
- Linux 指令大全
- 黑马程序员——java---String
- Eclipse debug窗口问题
- eclipse中报错:java.lang.OutOfMemoryError: Java heap space
- 【java编程】GUI之综合练习(一)
- gdb常用调试命令 解决Segmentation fault
- PHP根据手机号获取归属地