Bagaimana cara menolak akses ke metode superclass

Saya bertanya-tanya bagaimana saya bisa menolak akses ke metode superclass suatu kelas?

Contoh: Saya mempunyai kelas Pintu, dan kelas Kekosongan, yang pada dasarnya hanyalah sebuah pintu terbuka untuk aplikasi saya, sekarang saya ingin mewarisi sebagian besar metode pintu tetapi saya tidak ingin pengguna dapat memanggil 'pintu tertutup' metode pada kekosongan, bagaimana saya bisa melakukan itu?


person Samuel    schedule 17.04.2011    source sumber
comment
Jadikan metode ini pribadi?   -  person Marnix    schedule 17.04.2011
comment
Tapi mengapa pengguna juga tidak bisa menyebutnya di pintu?   -  person Samuel    schedule 17.04.2011


Jawaban (5)


Sepertinya Emptyness gagal dalam tes "haruskah saya menjadi subkelas" sehubungan dengan Door. Ujinya adalah kalimat berikut ini benar: Emptyness adalah Door. Karena Door dapat ditutup, Emptyness tidak memenuhi persyaratan tersebut.

Merekomendasikan penggunaan agregasi daripada pewarisan. Minta Emptyness mengimplementasikan antarmukanya sendiri (atau antarmuka lain yang relevan, namun tidak Door) dan berisi instance Door yang digunakannya untuk memenuhi operasi yang relevan.

Melakukan sesuatu seperti mengganti operasi close untuk tidak melakukan apa pun atau melontarkan pengecualian sama sekali tidak pantas kecuali Door#close didefinisikan sebagai opsional (melalui tag throws untuk pengecualian yang relevan). (Dan berhati-hatilah terhadap operasi "opsional" dalam hierarki kelas, mereka biasanya menunjukkan masalah desain. Tidak selalu, tapi biasanya.) Contoh yang diberikan Andreas tentang Iterator#remove, misalnya: Iterator#remove ditandai sebagai melempar UnsupportedOperationException. Jika Door#close diberi tag seperti itu, dan jika Anda merasa nyaman dengan cara melakukan sesuatu, bagus, Anda ada di sana. Namun jika tidak, maka Emptyness gagal memenuhi kontrak Door, yang biasanya berarti Anda harus mengambil jalan lain.

person T.J. Crowder    schedule 17.04.2011

Kami jelas tidak dapat mengurangi visibilitas saat mengganti suatu metode. Jika metode tutup pintu di Door adalah public, metode yang diganti di Emptyness tidak bisa bersifat pribadi...

Pendekatan yang biasa dilakukan adalah dengan mengganti metode tutup pintu di Emptyness dan tidak melakukan apa pun atau membuang beberapa UnsupportedOperationException (seperti yang dilakukan pelaksana Iterator, jika mereka tidak mengizinkan penghapusan elemen).

Contoh:

 public class Door {
   public void closeDoor() {
     // closing door actions
   }
 }

 public class Emptyness extends Door {
   @Override void closeDoor() {
     // do nothing or
     throw new UnsupportedOperationException("Can't close door on Emptyness");
   }
 }
person Andreas Dolk    schedule 17.04.2011

Mengapa tidak menggunakan Pola Desainer. Karena metode closeDoor tidak umum untuk semua subkelas Door, maka metode tersebut tidak boleh ada di kelas Door sama sekali, melainkan buat antarmuka dengan nama Closable dengan metode close, implementasikan antarmuka tersebut di beberapa kelas seperti ClosableTrue dan ClosableFalse. Sekarang buatlah variabel referensi di kelas Door bertipe Closable dan inisialisasi di konstruktor kelas dengan objek ClosableTrue atau ClosableFalse bergantung pada tipe argumen yang diteruskan ke konstruktor. Sekarang setiap kali metode close dipanggil pada objek Door atau subkelas Door, metode yang akan dipanggil adalah metode yang kelasnya digunakan untuk menginisialisasi konstruktor Door. Anda dapat mengimplementasikan metode close kelas ClosableFalse tanpa fungsionalitas yang berarti.

person Lavneesh    schedule 17.04.2011

Jadikan pintu pribadi di kelas. Karena jika Anda memiliki public atau protected di kelas super maka Anda tidak dapat memiliki pengubah akses yang lebih ketat di hierarki ke bawah. Jadi Anda tidak bisa menjadikannya pribadi di kelas Kosong, melainkan Anda harus melakukannya di kelas Door.

person GuruKulki    schedule 17.04.2011

Ada banyak pilihan. Pilih mana yang sesuai dengan kebutuhan Anda

  1. Buatlah metode private
  2. Buatlah metode final agar tidak dapat ditimpa dan tambahkan juga logika pengecekan jika metode tersebut dipanggil dari instanceof Kekosongan lalu berikan pengecualian.

     public class Emptiness extends Door{
    
    
            public static void main(String[] args) throws Exception {
                Door x = new Emptiness();
                x.somemethod();
            }
    
        }
    

    Pintu Kelas

    public class Door {         
            final public void somemethod() throws Exception{
                if(this instanceof Emptiness){
                    throw new Exception();
                }
            }
        }
    
person Abhishek    schedule 17.04.2011
comment
Sejujurnya, saya tidak menyukainya - suatu kelas tidak boleh mengimplementasikan fungsionalitas, yang jelas dan eksklusif milik subkelas - dalam hal ini: Kekosongan tidak dapat menutup pintu. - person Andreas Dolk; 17.04.2011
comment
Ya, aku juga tidak. Itu dikompilasi tetapi bukan OOP . Salahku - person Abhishek; 17.04.2011