为什么 ruby 允许子类访问父类的私有方法?

问题描述 投票:0回答:2
class Main
    def say_hello
        puts "Hello"
    end
    
    private
        def say_hi
            puts "hi"
        end
end

class SubMain < Main
    def say_hello
        puts "Testing #{say_hi}"
    end

end

test = SubMain.new
test.say_hello()    

输出:

测试

ruby oop
2个回答
14
投票

不同之处在于,在 ruby 中,您可以隐式但不能显式调用子类中的私有方法。 protected 可以用两种方式调用。至于为什么?我想你得问 Matz。

示例:

class TestMain

  protected
  def say_hola
    puts "hola"
  end

  def say_ni_hao
    puts "ni hao"
  end

  private
  def say_hi
    puts "hi"
  end

  def say_bonjour
    puts "bonjour"
  end
end

class SubMain < TestMain
  def say_hellos
    # works - protected/implicit
    say_hola
    # works - protected/explicit
    self.say_ni_hao

    # works - private/implicit
    say_hi
    # fails - private/explicit
    self.say_bonjour
  end
end

test = SubMain.new
test.say_hellos()

0
投票

我强烈支持 CodeCrack,当我发现这个“私有”并不是真正的“私有”时,我感到非常惊讶。

我大约一年前开始使用 Ruby。在此之前,我几乎使用过所有其他 OOP 语言。 Ruby 最令人恼火的地方是它太“随机设计”和太多“基于意见”,而不是像 C++ 和 Python 那样尝试标准化,有原则可循,你不应该期待意外。 Ruby 完全相反,我认为这就是它更难维护的原因。我时不时地必须环顾四周,找出奇怪的语法的真正含义(就像许多符号表达式一样)。

我们真正应该问的一个问题是:为什么会这样?它试图用这种方式解决什么样的问题?

缺点对我来说很明显:现在我必须学习“隐式”和“显式”的含义。

无论如何,语言是一种工具,应该易于使用和易于维护。我不认为 Ruby 会走这条路。

我个人不向其他人推荐 Ruby。应该尽快扔掉。

© www.soinside.com 2019 - 2024. All rights reserved.