新手问题 使用继承技术的例子?

dreamable · 2013年01月10日 · 最后由 i5ting 回复于 2013年02月20日 · 6544 次阅读

我想学学在 Rails 中如何使用继承,找的资料都是 STI 相关的,这个只是 Model 层的。之上的 Controller 和 Views 如何实现没概念,有人知道有类似的例子么,学习一下别人的实现代码。 谢谢。

Rails 里的继承不是给 Model 用就是给 Lib 用,没人会继承一个 Controller 或是继承 View 啊,而且后者还是不可继承的。 而且为了弘扬组合比继承好的伟大革命精神,现在都很少用继承的。

Controller 的继承还是有的吧

为了使用继承而使用继承?

#1 楼 @iBachue 如果 Model 继承了,相应的控制器不也得继承么?还是就用一个 controller?那如果子类有不同行为该怎么处理?

比如我有一个"习题"的父类,下面有“选择题”,“问答题”等子类。这些子类不需要自己的控制器?如果都用习题的控制器,那子类有不同行为怎么办?例如选择题和问答题的显示就不同,问答题直接显示问题就好了,选择题给用户可选框就更好些。

另外您讲组合比继承好,不是太明白。上面这个习题的例子怎么用组合实现?

谢谢了。

#3 楼 @Rei 不是为了继承而继承,是想通过继承去除冗余代码。当 ModelB 继承了 ModelA,那 A 不需要自己的 Controller 么,还是继续使用 AController?如果在 View 中需要不同的显示,怎么处理?用 If(classtype)处理?那子类很多,代码岂不是很乱。

#5 楼 @dreamable 首先,慎用继承,如果 model 或者 contorller 有重复的代码,可以抽取 Concern http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

然后,Model 用了继承,Controller 不一定要继承,像 Ruby China 的消息通知(https://github.com/ruby-china/ruby-china/tree/master/app/models/notification)继承了同一个 model,但是 Controller 用的是同一个,一致的 read, destroy 行为。继承本来不就是让他们表现一样的行为么?消息通知用继承的原因是希望各类消息存在同一个集合。

至于 View,if 处理没问题,或者像 Ruby China 这样利用局部模板

<%= render :partial => "notifications/#{notification.class.name.underscore}", :locals => {:notification => notification} %>

把同样的代码放到一个 module 里,include 就好了,不要生搬硬套 Java 思想

#6 楼 @Rei 万分感谢。 看来把继承放到 Model 层就好了,原来想的可能太复杂了。Java 用的比较多,一下子转不过弯来。 Ruby-china 真的不错,请教讨论一下,比自己想要有效率的多了。

#7 楼 @luikore 嗯,对 Ruby 还不是太熟悉,就直接开始用 Rails。Rails 最开始开发太容易了,反而把基础薄弱的问题掩盖了,我得回去好好看看 Module 的用法。

弱弱的问一下 STI 是啥? @luikore

需要 登录 后方可回复, 如果你还没有账号请 注册新账号