庄周梦蝶,孰蝶是我,我是孰蝶?一梦至今,蝶我已难分
首页
新随笔
联系
聚合
管理
随笔-370 评论-469 文章-7 trackbacks-0
ruby实现抽象类和抽象方法
ruby语言本身并没有提供abstract class和abstract method机制。这是ruby的spirit所决定的。但如果我们真的需要定义一个公共抽象类(或者抽象方法)来让子类来实现,又该如何做呢?
我们可以通过在调用方法时抛出
NotImplementedError来防止方法被调用。如(来自《ruby cookbook》的例子):
class Shape2D
def area
raise NotImplementedError
.
new(
"
#{self.class.name}#area是抽象方法
"
)
end
end
class Square
<
Shape2D
def initialize(
length
)
@length
=
length
end
def area
@length
**
2
end
end
父类
Shape2D的方法area就是我们所需要的“抽象方法”了。你不能直接调用:
s1
=
Shape2D
.
new
s1
.
area
这样调用将抛出错误:
Shape2D#area是抽象方法 (NotImplementedError)
Shape2D的子类
Square覆写了此方法。由此我们模拟实现了抽象方法。那么抽象类该如何实现呢?自然而然,我们想到如果把类的initialize方法这样处理,那么这样的类将没办法被new生成,不正是我们所需要的抽象类?说干就干:
class Shape2D
def initialize
raise NotImplementedError
.
new(
"
#{self.class.name}#area是抽象类
"
)
end
def area
raise NotImplementedError
.
new(
"
#{self.class.name}#area是抽象方法
"
)
end
end
当你调用Shape2D.new时,解释器将提示你:
Shape2D是抽象类(NotImplementedError)
我们已经实现了抽象方法和抽象类,感觉还是不够好,对每一个需要实现抽象类的类来说,我们都需要去写一句:raise NotImplementedError.new...实在不够爽。ruby鼓励我们去修改类的行为,甚至是标准库,那好,我们修改Class类吧,提供类似attr_reader的声明式服务:
class Class
def
abstract(
*
args)
args
.
each
do
|
method_name
|
define_method(method_name)
do
|*
args
|
if
method_name
==
:
initialize
msg
=
"
#{self.class.name}是抽象类
"
else
msg
=
"
#{self.class.name}##{method_name}是抽象方法
"
end
raise NotImplementedError
.
new(msg)
end
end
end
end
OK,如此一来,我们的Shape2D可以写成:
class Shape2D
abstract
:
initialize
,:
area
#
initialize和area是抽象方法
end
尽管在ruby中,抽象类和抽象方法是否有用存在怀疑,不过知道这样的办法总是不错的主意
posted on 2007-02-06 13:07
dennis
阅读(619)
评论(1)
编辑
收藏
所属分类:
动态语言 & rails
评论:
#
re: ruby实现抽象类和抽象方法
2007-02-06 20:01 |
rubycainiao
连句柄的类型都没有了,还要多态干什么呢?
回复
更多评论
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
Scala Ring Benchmark
关于Object.object_id方法
scheme中文编程
安装配置Emacs-rails
ubuntu下解决Ruby安装后缺少openssl的问题
使用Ruby amb解决说谎者谜题
降低JRuby的内存占用的可能方法
swfheader 0.10 Released(已更正下载地址)
Ruby Tip——读文件
Ruby 1.9概要(5) 异常
热爱编程,从事C/C++、Java、Ruby开发,关注高性能网络编程和函数式编程等方面,有兴趣的一起探讨,我的gmail:
输入您的搜索字词
提交搜索表单
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(29)
给我留言
查看公开留言
查看私人留言
随笔分类
ACE & libevent & apr(2)
C#历程(13)
erlang(12)
Hadoop与分布式(5)
java(103)
linux & C(24)
my open-source(40)
Prolog(3)
web开发(13)
动态语言 & rails(63)
小毅同学二三事(1)
工作流(5)
数据库技术(13)
数据结构与算法(21)
模式与架构(18)
涂鸦(89)
源码解读(17)
计算机科学与基础(45)
软件工程(2)
随笔档案
2009年6月 (9)
2009年5月 (11)
2009年4月 (3)
2009年3月 (12)
2009年2月 (7)
2009年1月 (3)
2008年12月 (2)
2008年11月 (12)
2008年10月 (12)
2008年9月 (7)
2008年8月 (9)
2008年7月 (3)
2008年6月 (10)
2008年5月 (11)
2008年4月 (12)
2008年3月 (10)
2008年2月 (12)
2008年1月 (10)
2007年12月 (2)
2007年11月 (6)
2007年10月 (11)
2007年9月 (19)
2007年8月 (11)
2007年7月 (20)
2007年6月 (16)
2007年5月 (16)
2007年4月 (25)
2007年3月 (35)
2007年2月 (52)
文章分类
java(6)
ruby & rails(1)
友情链接
BIGN's blog
SVNHost
开放源码托管
swfheader
xmemcached
yanf4j
Yet another nio framework for java
云之远
坏男孩
多背一公斤
老朱的blog
邢红瑞的blog
锋爷的blog
阿宝的blog
阿欢的blog
资源类
javaeye
TopLanguage
梦想风暴
负暄琐话
最新随笔
1. os的进程调度(读书笔记)
2. 最近的工作(mina vs. yanf4j)
3. xmemcached发布1.1.2 (权重、noreply、spring集成)
4. Xmemcached实现权重memcached节点(更新)
5. sicp 5.1节习题尝试解答
6. Scala Ring Benchmark
7. Java Memcached Client的Benchmark——xmemcached发布1.1.1
8. 24条人命比不上党的喉舌一条命
9. 累并快乐着
10. 方法签名,泛型滥用?
搜索
积分与排名
积分 - 328884
排名 - 28
最新评论
1. re: 写操作系统?看看这个(转载)
评论内容较长,点击标题查看
--upwardit
2. re: 轻松实现Apache,Tomcat集群和负载均衡(转)
我也是按照你这样配置的,我配了两个Tomcat 可是为什么我的两个服务器不能实现负载均衡呢?值能是一个Down掉了另一个才起得来,这是为什么呀?
--叶天
3. re: 轻松实现Apache,Tomcat集群和负载均衡(转)
请尽快的回答我行吗 急用 谢谢
--叶天
4. re: xmemcached发布1.1.2 (权重、noreply、spring集成)[未登录]
@ymfans
多谢关注,有任何问题和bug请及时反馈,感谢使用。
--dennis
5. re: xmemcached发布1.1.2 (权重、noreply、spring集成)
谢谢,果然是忘了检查 memcached的版本
--ymfans
阅读排行榜
1. Hadoop分布式文件系统:架构和设计要点(14416)
2. 体验了一把JavaFx(12066)
3. javascript之DOM技术(一)(7585)
4. 图文并茂——使用xfire编写webservice,并通过C#调用(5750)
5. 用osworkflow写一个请假例子(4772)
评论排行榜
1. 用osworkflow写一个请假例子(26)
2. Hadoop分布式文件系统:架构和设计要点(18)
3. 图文并茂——使用xfire编写webservice,并通过C#调用(13)
4. 体验了一把JavaFx(12)
5. 关于加班(10)
60天内阅读排行
1. 方法签名,泛型滥用?(1487)
2. xmemcached正式发布1.10——比spymemcached更快。(1253)
3. xmemcached发布1.1.2 (权重、noreply、spring集成)(1087)
4. Java Memcached Client的Benchmark——xmemcached发布1.1.1(1028)
5. Scala Ring Benchmark(996)