读《松本行弘的程序世界》

边读边记录,文章会很长,所以一次没办法写完

面向对象:
该如何考虑在2.3.8提到的:只有包含继承关系的类才会具有多态性?
在编程时往往要求到的扩展性,实现扩展性的一个重要方法是抽象化,对数据及其要做的处理都封装起来,当做一个黑盒子,不用在乎其内部怎么实现,我只需要一个输入,你给我一个我想要的输出,相比于C语言等面向过程的语言中对数据封装的结构体,面向对象语言的使用类对数据及其操作方法进行了封装,对数据的处理通过这些可将的操作方法来完成的,这里的类已经是一个黑盒子,我们不知道其处理方法,但我们可以拿到想要的结果,黑盒子的出现降低了程序的复杂度,对于使用了这个黑盒子的其他程序而言,在黑盒子中出现的修改变更是不可见的,由此,在有了需求需要改动实现者再次改动了这个黑盒子后,也不会对外部使用这个黑盒子的程序造成任何代码上的影响,结果上的一致可以由实现者使用完备的单元测试来保证。
对于多态性,很多资料上已经提到了很多了,即不同种类的东西当做同一类来解决,面向对象的编程语言都具有下面两点共同的特性:

1.不需要知道内部的详细处理就可以进行操作(封装,数据抽象)
2.根据不同的数据类型知道选择适当的方法(多态性)

第一点就是开头写道的内容,对于第二点,按照书中描述得内容,根据数据类型进行合适的处理(调用合适的方法)应该是编程语言完成的事,该如何理解这句话?结构化的编程方法带来了对程序逻辑的限制,实现了我们需要的功能,虽然其降低了程序的自由度,但设想一种场景:

public void Open(box)
{

if(TypeOf(box) == "A")
{
system.out.println("打开箱子");
}

else if(TypeOf(box) == "B")
{
system.out.println("开锁,打开箱子");
}

 else
{
system.out.println("打不开箱子");
}

}

这个时候新增了一个类型C,那么需要重写上面的结构。对于正常工作的代码再去修改会有风险。

public class A
{

    public void Open(){system.out.println("打开箱子");}

}

public class B
{

    public void Open(){system.out.println("开锁,打开箱子");}

}

继承是实现多态的基础,因此当A,B,C都继承自对象Box,那么直接调用Open方法就可以实现if,else的功能。
多态能减少代码中出现的分支数量,且在扩展时满足使用新增避免修改。

多重继承和单一继承
Java,C#中类只能为单一继承,这样做的目的,是因为结构简单,如果使用允许类多重继承,那么类之间的关系不再是一个树而是一个图,这样会导致继承之两个父类如果有相同的实现方法会带来冲突,即一个是优先级问题,另一个,当某个类出现问题后,多重继承会对问题的定位带来麻烦。但对于多重身份的类而言,多重继承是必不可少的。所以在Java中,解决办法是类只允许单一继承(extends),但接口允许多重继承(implements),在Ruby中使用Mix-in来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值