在子类中使访问器成为私有的

时间:2016-02-12 13:42:28

标签: ruby inheritance

我们说我有一个带有公共访问者的A类:

class Test_A
    attr_accessor :a
    attr_accessor :b
    attr_accessor :c
end

可以访问其实例变量,例如:

test = Test_A.new()
test.a = 3

我想继承Test_B中的类Test_A:

class Test_B < Test_A
    private
        attr_accessor :d
        attr_accessor :e
end

现在也可以在Test_B中访问从Test_A继承的实例变量:

test = Test_B.new()
test.a = 3

我想实现以下目标:

  • 如果我创建了一个Test_A实例,则所有实例变量都可以从外部访问。
  • 如果我创建了一个Test_B实例,我希望Test_A中所有继承的实例变量和方法都是私有的。

有没有办法在子类中将方法和实例变量标记为私有?

只是一些背景:我正在开发一个基于rake的构建系统:有许多&#34; recipe&#34;将定义软件源的文件,如:

sw_pkg.srcs = "blabla.c blabla2.c"
sw_pkg.incs = "blabla.h blabla2.h"

&#34; sw_pkg&#34;可以是A类的实例。在这些配方中,所有访问者都必须可以从外部访问。

在Rakefile中,我扫描所有这些配方并使用B类,它定义了构建配方文件中定义的源的所有方法。但是,在Rakefile中,我不想修改来自&#34;外部&#34;

的A类派生的访问者的任何内容。

1 个答案:

答案 0 :(得分:2)

是的,有。

class Test_A
  attr_accessor :d, :e
end

class Test_B < Test_A
  private :d, :d=, :e, :e=
end

但我认为拥有私有访问器是没用的,因为如果你可以省略接收器,那么你就在Test_B实例的上下文中,你可以直接访问实例变量而不使用访问器。