我希望这不是太主观。我无法决定这两种设计机会。
我有一个前置控制器模式。当用户浏览特定的URL时,我的框架会为此URL加载指定的View Controller。然后,View Controller会计算一些内容并加载视图模板,以显示结果。
现在想象你想创建一个像SO这样的网站。每个页面看起来非常相似:相同的标题,相同的菜单,相同的页脚。只是内容区域不同。您浏览“提问”页面,并希望“问新问题”表格出现在布局内。
因此,我们使用RootViewController
模板制作RootView
,以设置布局并为内容添加占位符。还有AskQuestionViewController
AskQuestionView
模板。
我们的Front Controller加载AskQuestionViewController
类。系统调用loadView()
方法,然后调用viewDidLoad()
方法。
AskQuestionViewController
继承自RootViewController
。方法被系统调用,并首先调用parent::loadView()
。因此RootViewController
有机会创建其RootView
模板。接下来,loadView()
加载AskQuestionView
模板,并将其分配给RootView
模板的内容占位符。
AskQuestionViewController
不会从RootViewController
继承。 loadView()
AskQuestionViewController
方法首先加载RootViewController
。然后,它会加载自己的AskQuestionView
模板,并将其分配给RootView
模板的内容占位符。
这些视图控制器之间的唯一区别是,它们加载了不同的视图模板,并且它们具有不同的自定义方法来执行某些任务。即RootViewController
能够组成导航菜单并突出显示当前访问的内容。 RootViewController
中没有其他内容可用于AskQuestionViewController
。
哪种选择更好的设计?
答案 0 :(得分:5)
prefer composition over inheritance原则表明 B 更可取。
答案 1 :(得分:2)
AskQuestionViewController
实际上不是RootViewController
的专业化。所以,我肯定会说B.这两个控制器都可以从公共父类继承。
答案 2 :(得分:1)
这很难以一般的,独立于平台的方式回答,但我会选择B。