V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rqrq
V2EX  ›  程序员

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

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

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

    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   ❤️ 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-06-15 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   ·   实用小工具   ·   5651 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:33 · PVG 09:33 · LAX 17:33 · JFK 20:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.