OC循环渐进:开闭原则和里氏替换原则

在面向对象的学习中,如果要想写出健壮性较强的代码,就必须掌握开闭原则和里氏替换原则。

那么什么是开闭原则呢?而什么又是里氏替换原则原则呢?

开闭原则:所谓的开闭原则就是当我们改变一个软件时(比如软件扩展功能),应该通过扩展的方式来实现,而不是修改原来的代码。通俗来说就是:对扩展开发,对修改关闭。更直白点就是:代码中的对象具有多态性。

里氏替换原则:所谓的里氏替换原则就是:基类(就是父类)出现的地方,子类一定可以出现,也就是:重写父类中的方法。

使用开闭原则和里氏替换原则的案例如下:

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

到此,使用开闭原则和里氏替换原则的实力创建完毕!


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值