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()    

KELUARAN:

Hai

Pengujian

9
CodeCrack 18 Mei 2015, 04:14
Itu mewarisi metode itu. Mengapa menurut Anda tidak boleh disebut demikian?
 – 
spickermann
18 Mei 2015, 04:16
6
Karena begitulah perilaku OOP biasanya bekerja. Metode pribadi bersifat pribadi karena suatu alasan. Maka tidak ada perbedaan antara metode yang dilindungi dan metode pribadi jika kita mengizinkan kelas anak untuk mengaksesnya.
 – 
CodeCrack
18 Mei 2015, 04:45
1
@CodeCrack: Ada perbedaan yang sangat penting. Metode pribadi tidak dapat dipanggil pada penerima, meskipun penerima adalah self. Metode yang dilindungi dapat dipanggil pada penerima jika penerima berasal dari kelas yang sama atau kelas leluhur. Contoh yang sering dikutip adalah perbandingan: def <=>(other); self.value <=> other.value; end harus memiliki value sebagai publik atau dilindungi, karena nilai pribadi tidak dapat diakses pada objek lain. Ruby "private" hampir sama dengan "protected" di Jawa; itu adalah pergeseran terminologi.
 – 
Amadan
18 Mei 2015, 04:57
1
Saya setuju bahwa visibilitas di Ruby berbeda dari bahasa pemrograman lain seperti Java misalnya. Tapi saya tidak akan menyebutnya salah karena itu. Ini hanya berbeda dan Anda harus mempelajari perbedaan antar bahasa ini jika Anda ingin menguasai banyak bahasa.
 – 
spickermann
18 Mei 2015, 05:00
3
Dan mengikuti apa yang dilakukan bahasa lain tidak terlalu dapat diandalkan. PHP diam-diam mengabaikan 98 di 01398, menghasilkan 11; tidak ada alasan penguraian bilangan bulat bahasa lain diharapkan sama buruknya. Ruby memiliki model objeknya sendiri, tidak disalin dari Java atau PHP; itu memenuhi semua persyaratan paradigma OO; dan harus dipelajari dengan caranya sendiri.
 – 
Amadan
18 Mei 2015, 05:02

1 menjawab

Jawaban Terbaik

Perbedaannya adalah bahwa di Ruby Anda dapat memanggil metode pribadi di subkelas secara implisit tetapi tidak secara eksplisit. Dilindungi bisa disebut dua arah. Adapun mengapa? Saya kira Anda harus bertanya pada Matz.

Contoh:

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()
13
kellsaro 20 November 2020, 20:50