在学到设计原则"多组合,少继承"时,文中提到:
继承的子类,实际上需要编译期确定下来。而组合却可以比继承灵活得多,可以在运行期才决定某个对象。
我想问一下,这里的编译期和运行期分别指什么意思?为什么通过组合就能在运行期决定某个对象呢? 谢谢~
简单来说:A从B继承,这一点是不能在运行期改变的。也就是说,你New出来一个A对象,那么,他一定具有B对象的特性和行为(当然不包括重写过的方法)。你在代码编译成执行文件后,就不能改变了。
但是,如果A组合了一个B对象。你就可以在运行时改变这一点。比如:你让A抓着一个B的子类而不是B来实现需要B完成的功能。这样为你的系统提供了更大的灵活性。
继承的子类,实际上需要编译期确定下来:继承关系的对象,他们的特征是可以确定的。也就是他们的数据结构可以确定。
而组合(这个概念我不太懂),但结合实际的应用,抽象工厂里面都有用到。一个项目有SqlDataProvider,OracleDataProvider,但实际上数据访问会使用哪个Provider呢?一般是在config文件里面配置的。这肯定是运行期的咯
编译就是说在运行前都定好的东西
运行指的是在运行的时候才会去调用的东西