问个 OOP 的问题:实例化子类的时候,父类也同时被实例化了,那么 controller 在调用 多个 model 时,岂不是会实例化多个 model 的父类? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rqrq
V2EX    程序员

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

  •  
  •   rqrq 2015-06-15 10:19:07 +08:00 4168 次点击
    这是一个创建于 3775 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    15 条回复    2015-06-16 08:34:55 +08:00
    rqrq
        1
    rqrq  
    OP
       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
        2
    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
        3
    JohnSmith  
       2015-06-15 11:03:51 +08:00
    推荐使用组合模式来实现集成成员和方法,这样可以解决你的问题,父类抽象和修改也会相对简单一点
    zhujinlong
        4
    zhujinlong  
       2015-06-15 11:53:52 +08:00   1
    实例化子类时,虽然父类的构造函数会被自动调用,但并不会实例化出一个父类对象.

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

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

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

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

    继承之类的东西都是语言为方便码农的生活而引入的一种抽象,即使是类型,在底层都是不存在的,从底层的角度看,一个对象不过是一块储存了固定字节的内存区域。
    xylophone21
        9
    xylophone21  
       2015-06-15 13:38:18 +08:00
    那么到底什么才是实例化呢
    otakustay
        10
    otakustay  
       2015-06-15 13:58:12 +08:00   1
    “实例化”和“构造函数执行”是两回事
    实例化只有一次,构造函数是父类会依次执行,并且执行在同一个实例上
    实例化除了构造函数之外,简单地说还包含了内存分配、指针指向等一系列事情
    hahasong
        11
    hahasong  
       2015-06-15 14:06:56 +08:00
    JAVA里,实例化子类是会同时递归实例化该子类的所有父类的,只不过是隐式的。基础书有上讲。
    PHP里,实例化子类只是执行父类的构造函数,没有实例化父类。
    这些都是编译器的动作,完全不需要管,按正常业务写就行了
    zmj1316
        12
    zmj1316  
       2015-06-15 16:25:19 +08:00 via Android
    感觉ls的大家是不是没有get到lz的点 ?
    akira
        13
    akira  
       2015-0615 17:39:32 +08:00
    想太多了,这不是一个问题。
    rqrq
        14
    rqrq  
    OP
       2015-06-16 02:03:55 +08:00
    @zmj1316 get到了
    zmj1316
        15
    zmj1316  
       2015-06-16 08:34:55 +08:00
    @rqrq 我觉得2L说的是在解决问题...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3768 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:09 PVG 13:09 LAX 22:09 JFK 01:09
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86