免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6217 | 回复: 5
打印 上一主题 下一主题

继承与类常量问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-19 23:38 |只看该作者 |倒序浏览
5可用积分

  1. # reporter.rb

  2. require 'logger'

  3. class Reporter
  4.     # Reporter Attributes
  5.     attr    :bugs
  6.     attr    :params

  7.     # defined statics
  8.     @@logger = Logger.new('/tmp/' + self.to_s.downcase + '.log', 'daily')

  9.     # Contruct Method
  10.     def initialize
  11.         begin
  12.             @@logger.info('initialize')
  13.         rescue
  14.             # TODO
  15.         end
  16.     end
  17. end

  18. class AnotherReporter < Reporter
  19. end

复制代码


当我 Reporter.new 其实和 AnotherReporter.new 时都会写日志文件,但都只会写入到/tmp/reporter.log,
然尔我现在想把AnotherReporter的日志写入一个/tmp/anotherreporter.log,请问这个代码应该如何写?

论坛徽章:
0
2 [报告]
发表于 2008-09-21 15:26 |只看该作者
重新定义类变量:
class AnotherReporter < Reporter
    @@logger = Logger.new('/tmp/' + self.to_s.downcase + '.log', 'daily')
end

论坛徽章:
0
3 [报告]
发表于 2008-09-23 13:20 |只看该作者
恩,我后来试演过

其实不能用@@logger, 一旦设置了该类变量,一旦被其他类继承就会重载这个类变量

class A
    @@prop = 'A'
    def test
        puts @@prop
    end
end

class B < A
    @@prop = 'B'
end


a = A.new
b = B.new

a.test    #=> B
b.test    #=> B

论坛徽章:
0
4 [报告]
发表于 2008-09-23 14:42 |只看该作者
确实如此,class variable 是会被覆盖的。不好意思,我是初学者。
用类实例变量(class instance variable) 看看这样行不行?
class A
  @logger = self.to_s + '.log'
def A.p
  puts @logger
end

class B < A
  @logger = self.to_s + '.log'
end

A.new.class.p   => A.log
B.new.class.p   => B.log

论坛徽章:
0
5 [报告]
发表于 2008-09-25 11:52 |只看该作者


  1. module M
  2.     @@T = ''
  3.     def test; puts @@T; end;
  4.     def stest; puts self.class::T; end;
  5. end

  6. module N
  7.     def rtest; self.class.jtest(); end
  8. end

  9. class A
  10.     include M
  11.     @@T = 'A'
  12.     T = 'sA'
  13.     def self.itest; puts T; end
  14.     def A.jtest; puts A::T; end
  15.     def self.ktest; puts T; end
  16.     include N
  17. end

  18. class B
  19.     include M
  20.     @@T = 'B'
  21.     T = 'sB'
  22.     def self.itest; puts T; end
  23.     def B.jtest; puts B::T; end
  24.     def self.ktest; A.ktest; end
  25.     include N
  26. end

  27. A.new.test      #=> A
  28. B.new.test      #=> B
  29. A.new.stest     #=> sA
  30. B.new.stest     #=> sB
  31. A.itest         #=> sA
  32. B.itest         #=> sB
  33. A.jtest         #=> sA
  34. B.jtest         #=> sB
  35. A.ktest         #=> sA
  36. B.ktest         #=> sA
  37. A.new.rtest     #=> sA
  38. B.new.rtest     #=> sB


复制代码

论坛徽章:
0
6 [报告]
发表于 2008-09-28 22:17 |只看该作者
class A
  def initialize(log)
    #log
  end
end

class B < A
  def initialize(log)
    super(log)
  end
end
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP