在面向对象的学习中,如果要想写出健壮性较强的代码,就必须掌握开闭原则和里氏替换原则。
那么什么是开闭原则呢?而什么又是里氏替换原则原则呢?
开闭原则:所谓的开闭原则就是当我们改变一个软件时(比如软件扩展功能),应该通过扩展的方式来实现,而不是修改原来的代码。通俗来说就是:对扩展开发,对修改关闭。更直白点就是:代码中的对象具有多态性。
里氏替换原则:所谓的里氏替换原则就是:基类(就是父类)出现的地方,子类一定可以出现,也就是:重写父类中的方法。
使用开闭原则和里氏替换原则的案例如下:
1.建一个多边形父类,提供就是周长和面积的方法
MyPolygon.h的文件代码如下:
#import <Foundation/Foundation.h>
@interface MyPolygon : NSObject
- (void)area;
- (void)zhouChang;
@end
MyPolygon.m的文件代码如下:
#import "MyPolygon.h"
@implementation MyPolygon
- (void)area {
NSLog(@"计算面积");
}
- (void)zhouChang {
NSLog(@"计算周长");
}
@end
2.建立MyPolygon的两个子类Square(正方形)和Rectangular(长方形),使用里氏替换原则重写父类中的方法
(1)Square.h的文件代码如下:
#import "MyPolygon.h"
@interface Square : MyPolygon
@property (nonatomic,assign) CGFloat width;
- (id)initWithWidth:(CGFloat)width;
@end
Square.m的文件代码如下:
#import "Square.h"
@implementation Square
- (id)initWithWidth:(CGFloat)width {
if (self = [super init]) {
_width = width;
}
return self;
}
- (void)area {
[super area];
CGFloat area = self.width * self.width;
NSLog(@"正方形的面积为%.2f",area);
}
- (void)zhouChang {
[super zhouChang];
CGFloat zhongChang = 4 * self.width;
NSLog(@"正方形的周长为:%.2f",zhongChang);
}
@end
(1)Rectangular.h的文件代码如下:
#import "MyPolygon.h"
@interface Rectangular : MyPolygon
@property (nonatomic,assign) CGFloat width;
@property (nonatomic,assign) CGFloat height;
- (id)initWithWidth:(CGFloat)width height:(CGFloat)height;
@end
Rectangular.m的文件代码如下:
#import "Rectangular.h"
@implementation Rectangular
- (id)initWithWidth:(CGFloat)width height:(CGFloat)height {
if (self = [super init]) {
_width = width;
_height = height;
}
return self;
}
- (void)area {
[super area];
CGFloat area = self.height * self.width;
NSLog(@"长方形的面积为:%.2f",area);
}
- (void)zhouChang {
[super zhouChang];
CGFloat zhouChang = (self.height + self.width) * 2;
NSLog(@"长方形的周长为:%.2f",zhouChang);
}
@end
3.创建Accouter(计算)类,在里面实现多态对象的多态
Accouter.h的文件代码如下:
#import <Foundation/Foundation.h>
#import "MyPolygon.h"
@interface Accounter : NSObject
- (void)caculate:(MyPolygon *)myPolygon;
@end
Accouter.m的文件代码如下:
#import "Accounter.h"
@implementation Accounter
- (void)caculate:(MyPolygon *)myPolygon {
[myPolygon area];
[myPolygon zhouChang];
}
@end
main.m文件代码如下:
#import <Foundation/Foundation.h>
#import "Square.h"
#import "Rectangular.h"
#import "Accounter.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Square *square = [[Square alloc] initWithWidth:45.0];
Rectangular *rect = [[Rectangular alloc] initWithWidth:34.6 height:26.8];
Accounter *account = [[Accounter alloc] init];
[account caculate:square];
[account caculate:rect];
}
return 0;
}
测试结果如下:
2015-08-07 23:20:20.995 MyOCDemo_273_01[906:40280] 计算面积
2015-08-07 23:20:21.042 MyOCDemo_273_01[906:40280] 正方形的面积为2025.00
2015-08-07 23:20:21.046 MyOCDemo_273_01[906:40280] 计算周长
2015-08-07 23:20:21.046 MyOCDemo_273_01[906:40280] 正方形的周长为:180.00
2015-08-07 23:20:21.047 MyOCDemo_273_01[906:40280] 计算面积
2015-08-07 23:20:21.047 MyOCDemo_273_01[906:40280] 长方形的面积为:927.28
2015-08-07 23:20:21.047 MyOCDemo_273_01[906:40280] 计算周长
2015-08-07 23:20:21.047 MyOCDemo_273_01[906:40280] 长方形的周长为:122.80
到此,使用开闭原则和里氏替换原则的实力创建完毕!