关于类扩展的几种方式的思考

关于类扩展的几种方式的思考

一、通过继承的方式对基类进行扩展



图 1

         假如已有某个类Foo,通过继承的方式产生了派生类Bar,它们之间的关系如图1所示。这种方式也正是OO的精华之一,既保持了与人的思维一致,又复用了代码。现在再来看看实例化一个Bar类的过程,首先Bar的基类被初始化,也就是说Bar的基类的“对象”已经生成,然后是初始化Bar本身。整个过程也比较简单,但是如果Bar还继承了其他的类Other,那这个Other类也同样被“实例化”了。也许Other类的任何操作在整个过程中都没有被使用,这样就造成了无谓的空间(时间)开销。同时生硬的通过该种方式扩展某个类,将会造成维护、灵活性等诸多方面的问题。由此产生了许多Design Patterns来帮助我们解决这些问题。

二、通过Strategy Pattern对类进行扩展



图 2

         假如使用Strategy Pattern对类进行扩展,那么就可以解决第一种方式所存在的问题。当通过Foo的实例获得Bar的操作时,可以通过GetBar方法来取得一个Bar的对象,而这个Bar对象的实例化过程是完全由程序员来操控的,所以可以避免在不需要Bar时而造成空间(时间)的浪费。但是此种方法只能是先预留Foo可能被扩展的接口,针对于没考虑到的情况将无法通过此种方式实现扩展。

三、通过关联的方式将类和扩展类联合,实现扩展



图 3

           要解决第二种方法存在的问题,可以使用关联的方式来解决。假如存在类Foo,要对它进行扩展,可以建立一个类FooExt,它包含了Foo的所有扩展。现在再建立一个类Bar,它维护了Foo与FooExt之间的关系,将这两个类关联在一起。使用的过程中,只需保持Bar对象,然后通过ConvertTo方法就可以获得Foo或者FooExt的所有属性。因此Bar也就是Foo的扩展。这样,可以对Foo进行无限制的扩展,同时只需产生真正需要的类得实例。只是这种类之间的转换并不是在编译期实现的,性能上的开销可能会较第一种方式大很多,类型安全上也无法依赖编译器,使用时需维持类型的安全。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值