关于类扩展的几种方式的思考
一、通过继承的方式对基类进行扩展
![](http://hi.csdn.net/attachment/201107/16/0_1310825698lRC3.gif)
图 1
假如已有某个类Foo,通过继承的方式产生了派生类Bar,它们之间的关系如图1所示。这种方式也正是OO的精华之一,既保持了与人的思维一致,又复用了代码。现在再来看看实例化一个Bar类的过程,首先Bar的基类被初始化,也就是说Bar的基类的“对象”已经生成,然后是初始化Bar本身。整个过程也比较简单,但是如果Bar还继承了其他的类Other,那这个Other类也同样被“实例化”了。也许Other类的任何操作在整个过程中都没有被使用,这样就造成了无谓的空间(时间)开销。同时生硬的通过该种方式扩展某个类,将会造成维护、灵活性等诸多方面的问题。由此产生了许多Design Patterns来帮助我们解决这些问题。
二、通过Strategy Pattern对类进行扩展
![](http://hi.csdn.net/attachment/201107/16/0_13108257448Tjy.gif)
图 2
假如使用Strategy Pattern对类进行扩展,那么就可以解决第一种方式所存在的问题。当通过Foo的实例获得Bar的操作时,可以通过GetBar方法来取得一个Bar的对象,而这个Bar对象的实例化过程是完全由程序员来操控的,所以可以避免在不需要Bar时而造成空间(时间)的浪费。但是此种方法只能是先预留Foo可能被扩展的接口,针对于没考虑到的情况将无法通过此种方式实现扩展。
三、通过关联的方式将类和扩展类联合,实现扩展
![](http://hi.csdn.net/attachment/201107/16/0_1310825780wHWh.gif)
图 3
要解决第二种方法存在的问题,可以使用关联的方式来解决。假如存在类Foo,要对它进行扩展,可以建立一个类FooExt,它包含了Foo的所有扩展。现在再建立一个类Bar,它维护了Foo与FooExt之间的关系,将这两个类关联在一起。使用的过程中,只需保持Bar对象,然后通过ConvertTo方法就可以获得Foo或者FooExt的所有属性。因此Bar也就是Foo的扩展。这样,可以对Foo进行无限制的扩展,同时只需产生真正需要的类得实例。只是这种类之间的转换并不是在编译期实现的,性能上的开销可能会较第一种方式大很多,类型安全上也无法依赖编译器,使用时需维持类型的安全。