Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ruby允许子类访问父类';什么是私人方法? 主类 打个招呼 “你好” 结束 私有的 打个招呼 “嗨” 结束 结束 类子类_Ruby_Oop - Fatal编程技术网

为什么ruby允许子类访问父类';什么是私人方法? 主类 打个招呼 “你好” 结束 私有的 打个招呼 “嗨” 结束 结束 类子类

为什么ruby允许子类访问父类';什么是私人方法? 主类 打个招呼 “你好” 结束 私有的 打个招呼 “嗨” 结束 结束 类子类,ruby,oop,Ruby,Oop,输出: 嗨 测试 不同之处在于,在ruby中,可以隐式而非显式地调用子类中的私有方法。Protected可以双向调用。为什么呢?我想你得问问Matz 例如: class Main def say_hello puts "Hello" end private def say_hi puts "hi" end end class SubMain <

输出:

测试


不同之处在于,在ruby中,可以隐式而非显式地调用子类中的私有方法。Protected可以双向调用。为什么呢?我想你得问问Matz

例如:

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()    
类TestMain
受保护的
戴夫·萨伊·霍拉
“你好”
结束
你说什么
“倪浩”
结束
私有的
打个招呼
“嗨”
结束
你好
“你好”
结束
结束
类submin
它继承了该方法。为什么你认为不应该允许它调用它?@spickermann,因为OOP行为通常就是这样工作的。私有方法是私有的,这是有原因的。如果我们允许子类访问受保护方法和私有方法,那么它们之间就没有区别了。@CodeCrack:有一个非常重要的区别。不能在接收方上调用私有方法,即使接收方是
self
。如果接收方属于同一类或祖先类,则可以在接收方上调用受保护的方法。一个经常引用的例子是比较:
def(其他);自我价值、他人价值;end
必须将
值设置为public或protected,因为不能在另一个对象上访问私有值。Ruby“private”与Java中的“protected”差不多;这是一个术语上的转变,我同意Ruby的可见性不同于其他编程语言,比如Java。但我不会因此认为这是错误的。如果你想掌握多种语言,你就必须学习不同语言之间的差异,而按照其他语言的做法去做是不太可靠的。PHP默默地忽略
01398
中的
98
,生成
11
;没有理由认为其他语言对整数的解析也同样糟糕。Ruby有自己的对象模型,不是从Java或PHP复制的;它满足面向对象范式的所有要求;应该根据自己的条件来学习。
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()