问个 OOP 的问题:实例化子类的时候,父类也同时被实例化了,那么 controller 在调用 多个 model 时,岂不是会实例化多个 model 的父类?

2015-06-15 10:19:07 +08:00
 rqrq

应该如何设计才能合理的解决这个问题?或者说,这根本不是问题?

3672 次点击
所在节点    程序员
15 条回复
rqrq
2015-06-15 10:25:03 +08:00
标题没有描述清楚。

class modelA extends Model
class modelB extends Model
class modelC extends Model

controller 在 调用 这三个 model 时,Model 类要被实例化 3 次。
这是不是 OOP 的一个问题?
cevincheung
2015-06-15 10:28:48 +08:00
实例化三次是一定要的。就看一些其他问题怎么去规避,比如model中是不是连接了数据库?那连接那里就单例。是否有需要全局保持一致的变量?那就static修饰。

class model
function __construct():
$this->db = database::factory('mysql')

class database:
function factory($drive):
if (!self::$instance)
self::$instance = new $drive;
self::$instance->connect();
return self::$instance
JohnSmith
2015-06-15 11:03:51 +08:00
推荐使用组合模式来实现集成成员和方法,这样可以解决你的问题,父类抽象和修改也会相对简单一点
zhujinlong
2015-06-15 11:53:52 +08:00
实例化子类时,虽然父类的构造函数会被自动调用,但并不会实例化出一个父类对象.

起码Java是这样,C++印象中也是这样,php/ruby/python不清楚

http://liujinpan75.iteye.com/blog/785136

http://blog.csdn.net/hikvision_java_gyh/article/details/8957445
timsims
2015-06-15 11:57:44 +08:00
我觉得楼主想问的是会不会实例化6次。。。
zhujinlong
2015-06-15 12:01:32 +08:00
modelA modelB modelC 各实例化一次,Model 没有被实例化,我是说Java

调用初始化方法并不代表会生成对象
http://wenda.tianya.cn/question/3f6b7fd86547f728
21grams
2015-06-15 12:08:12 +08:00
Model为什么会实例化? Model如果实例化岂不是有六个实例了,别逗了。
mouhong
2015-06-15 12:10:05 +08:00
实例化一个子类只会创建一个对象。就好比生孩子的时候,孩子继承了父母的基因,要是实例化一个子类时,父类也会被实例化,那岂不相当于每生一个孩子,父母也会多一对出来,生第二个孩子时,这些孩子的父母变成三对了?

继承之类的东西都是语言为方便码农的生活而引入的一种抽象,即使是类型,在底层都是不存在的,从底层的角度看,一个对象不过是一块储存了固定字节的内存区域。
xylophone21
2015-06-15 13:38:18 +08:00
那么到底什么才是实例化呢😄
otakustay
2015-06-15 13:58:12 +08:00
“实例化”和“构造函数执行”是两回事
实例化只有一次,构造函数是父类会依次执行,并且执行在同一个实例上
实例化除了构造函数之外,简单地说还包含了内存分配、指针指向等一系列事情
hahasong
2015-06-15 14:06:56 +08:00
JAVA里,实例化子类是会同时递归实例化该子类的所有父类的,只不过是隐式的。基础书有上讲。
PHP里,实例化子类只是执行父类的构造函数,没有实例化父类。
这些都是编译器的动作,完全不需要管,按正常业务写就行了
zmj1316
2015-06-15 16:25:19 +08:00
感觉ls的大家是不是没有get到lz的点 ?
akira
2015-06-15 17:39:32 +08:00
想太多了,这不是一个问题。
rqrq
2015-06-16 02:03:55 +08:00
@zmj1316 get到了
zmj1316
2015-06-16 08:34:55 +08:00
@rqrq 我觉得2L说的是在解决问题...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/198597

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX