如何只允许一个类访问另一个类的方法?

君祖

我想要这样的东西:

class A
  def only_B_can_call_me
    'called_by_B'
  end
end

class B
  def do_stuff(a)
    a.only_B_can_call_me
  end
end

class C
  def do_stuff(a)
    a.only_B_can_call_me # how to forbid it?
  end
end

B.new.do_stuff(A.new) # => 'called_by_B'
C.new.do_stuff(A.new) # => it should not be allowed!!! but how to do it?

一种方法是创建only_B_can_call_me一个私有方法并a.send(:only_B_can_call_me)在 B 内部使用。好的,它可以工作。但是我可能会被诱惑在 C 中做同样的事情......所以,我认为这不是一个好方法。有没有其他方法可以做到这一点?(允许仅通过特定类的实例访问方法。)

(我知道最终总是可以从任何地方使用 访问任何方法send。但我想让自己远离send这种情况。)

塞尔吉奥·图伦采夫

没有明确的解决方案。如果 B 可以做到,C 也可以。 与其他一些语言不同,ruby 没有“内部”或“包”可见性修饰符,如果 A 和 B 在同一个“包”中,这可以帮助您,但 C 是外部的. 如果方法是私有的,即使 B 也必须使用send. 如果它是公开的,C 就可以调用它。B 在您的示例protected中不是A 的子类,因此修饰符不适用。

一种肮脏的方式是 check callerin only_B_can_call_me它返回整个调用堆栈。所以你可以检查它是否确实是 B 或者拒绝。但这是超级脆弱的,完全不推荐。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何访问另一个类的方法?

来自分类Dev

如何从另一个类的一个类访问方法?

来自分类Dev

是否只允许Java中的另一个类创建特定类的实例?

来自分类Dev

只允许访问一个类的几个属性?

来自分类Dev

访问另一个类的类方法/变量

来自分类Dev

如何通过在Javascript另一个类的实例访问另一个类中的方法

来自分类Dev

使用另一个类实例访问一个类方法?

来自分类Dev

从run方法锁定对另一个类的访问

来自分类Dev

从Android中的另一个类访问方法

来自分类Dev

访问另一个类的公共方法

来自分类Dev

从另一个类访问方法时出错

来自分类Dev

试图访问另一个类中的方法

来自分类Dev

如何将一个类访问另一个C#类

来自分类Dev

您如何访问另一个类中一个类的成员函数?

来自分类Dev

如何从另一个类正确访问一个类的 StringVar() - Python - tkinter

来自分类Dev

如何从另一个类访问一个类中的值?斯威夫特 4

来自分类Dev

如何从另一个类访问数组

来自分类Dev

如何从另一个类访问textarea?

来自分类Dev

如何从另一个类访问对象变量?

来自分类Dev

如何从另一个类访问对象

来自分类Dev

如何从另一个类访问列表的长度

来自分类Dev

如何从另一个类导入或访问UITextField

来自分类Dev

如何访问另一个类的对象

来自分类Dev

如何从另一个类访问ArrayList

来自分类Dev

如何访问并获取另一个类的属性?

来自分类Dev

如何从另一个类访问ArrayList

来自分类Dev

如何从另一个类访问ArrayList?

来自分类Dev

如何从另一个类访问数组

来自分类Dev

如何从另一个类访问功能