Polimorfisme vs Overriding vs Overloading

347

Dalam hal Jawa, ketika seseorang bertanya:

apa itu polimorfisme?

Apakah overloading atau overriding menjadi jawaban yang bisa diterima?

Saya pikir ada sedikit lebih dari itu.

JIKA Anda memiliki kelas dasar abstrak yang mendefinisikan metode tanpa implementasi, dan Anda mendefinisikan metode itu dalam sub kelas, apakah itu masih menimpa?

Saya pikir overloading bukanlah jawaban yang tepat.

Brian G
sumber
Jawaban di bawah ini menjelaskan dengan sangat baik tentang polimorfisme. Tetapi saya memiliki keberatan kuat untuk mengatakan overloading adalah jenis polimorfisme, yang saya coba benarkan dalam pertanyaan dan jawaban saya yang sebenarnya berkonsentrasi pada overloading adalah polimorfisme atau bukan. Saya mencoba untuk membenarkan @ The Digital Gabeg answer hadir di utas ini. Refer Elaboration: Metode overloading adalah pengikatan statis / waktu kompilasi tetapi bukan polimorfisme. Apakah benar mengkorelasikan pengikatan statis dengan polimorfisme?
PraveenKumar Lalasangi

Jawaban:

894

Cara paling jelas untuk mengekspresikan polimorfisme adalah melalui kelas dasar abstrak (atau antarmuka)

public abstract class Human{
   ...
   public abstract void goPee();
}

Kelas ini abstrak karena goPee() metode ini tidak dapat didefinisikan untuk Manusia. Ini hanya dapat didefinisikan untuk subclass Pria dan Wanita. Juga, Manusia adalah konsep abstrak - Anda tidak dapat membuat manusia yang bukan Pria atau Wanita. Pasti satu atau yang lain.

Jadi kami menunda implementasi dengan menggunakan kelas abstrak.

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

dan

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

Sekarang kita bisa memberi tahu seluruh ruangan yang penuh dengan Manusia untuk buang air kecil.

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

Menjalankan ini akan menghasilkan:

Stand Up
Sit Down
...
Chris Cudmore
sumber
37
@yuudachi. Saya datang dengan contoh ini ketika mengajar kelas. Kelas "Rekening Bank" kanonik tidak benar-benar mengungkapkan "abstrak" kelas dasar. Contoh kanonik lainnya (Animal, make noise) terlalu abstrak untuk dipahami. Saya sedang mencari satu basis dengan subclass yang terlalu jelas. Sebenarnya, goPee () adalah satu-satunya contoh yang saya temukan yang bukan jenis kelamin atau stereotip. (walaupun di kelas, saya mencetak "menyusuri lorong di sebelah kiri" alih-alih berdiri atau duduk.)
Chris Cudmore
100
Contoh ini juga menyoroti kesulitan menggunakan sistem hierarkis untuk menggambarkan sistem biologis. Beberapa manusia, seperti yang sangat muda, kencing di hampir semua posisi - dan bayi tidak dapat dengan mudah disuruh pergiPee (). Beberapa manusia adalah interseks, di mana label biologis "pria" atau "wanita" menjadi agak tidak jelas; makna sosial bahkan lebih kompleks. Sebagai contoh pengajaran, ini menunjukkan bagaimana asumsi pemodelan dapat memiliki hasil negatif, seperti implikasi bahwa seseorang (misalnya, seorang siswa pemrograman OO) yang mengompol atau interseks sebenarnya bukan manusia.
Andrew Dalke
7
Saya dapat memikirkan setidaknya segelintir manusia yang akan membantah tesis "Anda tidak dapat menciptakan manusia yang bukan pria atau wanita", meskipun itu masih berlaku untuk kode Anda ... abstraksi yang buruk saya kira saya katakan ? ;)
Frank W. Zammetti
2
Saya pikir penting untuk menunjukkan bahwa ini hanya polimorfisme karena versi goPee () mana yang dipanggil hanya dapat ditentukan saat runtime. Sementara contoh ini menyiratkan bahwa, itu bagus untuk menunjukkan mengapa tepatnya itu polimorfisme. Juga, itu tidak memerlukan kelas saudara. Ini bisa menjadi hubungan orangtua-anak juga. Atau bahkan kelas yang sama sekali tidak berhubungan yang secara kebetulan memiliki fungsi yang sama. Contohnya adalah fungsi .toString (). Yang bisa dipanggil secara acak pada objek apa pun, tetapi kompiler tidak pernah tahu persis jenis objek apa.
Tor Valamo
20
@AndrewDalke, +1 untuk catatan tentang kompleksitas biologis. Juga, goPeetidak mengambil medan gravitasi sebagai input. Ketergantungan pada keadaan global ini membuat pengujian unit menjadi CatheterizedIntersexAstronautsulit, dan menunjukkan bahwa subklas mungkin tidak selalu menjadi metode terbaik untuk komposisi sifat.
Mike Samuel
99

Polimorfisme adalah kemampuan instance kelas untuk berperilaku seolah-olah itu adalah instance dari kelas lain dalam pohon warisannya, paling sering salah satu kelas leluhurnya. Sebagai contoh, di Jawa semua kelas mewarisi dari Objek. Oleh karena itu, Anda dapat membuat variabel tipe objek dan menetapkan untuk itu instance kelas apa pun.

Sebuah overrideadalah jenis fungsi yang terjadi di kelas yang mewarisi dari kelas lain. Fungsi override "menggantikan" fungsi yang diwarisi dari kelas dasar, tetapi melakukannya sedemikian rupa sehingga disebut bahkan ketika turunan kelasnya berpura-pura menjadi tipe yang berbeda melalui polimorfisme. Mengacu pada contoh sebelumnya, Anda bisa mendefinisikan kelas Anda sendiri dan mengabaikan fungsi toString (). Karena fungsi ini diwarisi dari Object, itu masih akan tersedia jika Anda menyalin turunan kelas ini ke variabel tipe objek. Biasanya, jika Anda memanggil toString () di kelas Anda saat itu berpura-pura menjadi Obyek, versi toString yang sebenarnya akan diaktifkan adalah yang didefinisikan pada Object itu sendiri. Namun, karena fungsi ini menimpa, definisi toString () dari kelas Anda digunakan bahkan ketika instance kelas '

Overloading adalah tindakan mendefinisikan banyak metode dengan nama yang sama, tetapi dengan parameter yang berbeda. Ini tidak terkait dengan override atau polimorfisme.

Gabeg Digital
sumber
8
Ini sudah tua tetapi Polimorfisme tidak menyiratkan bahwa kelas lain harus di pohon warisan. Itu di Jawa jika Anda menganggap antarmuka sebagai bagian dari pohon warisan, tetapi tidak di Go, di mana antarmuka diterapkan secara implisit.
JN
5
Sebenarnya, Anda tidak perlu kelas untuk polimorfisme sama sekali.
StCredZero
3
Saya seorang pemula, dan mengoreksi saya jika saya salah, tetapi saya tidak akan mengatakan kelebihan beban tidak terkait dengan polimorfisme. Paling tidak di Jawa, polimorfisme adalah ketika implementasi dipilih berdasarkan jenis pemanggil, dan kelebihan adalah ketika implementasi dipilih berdasarkan tipe parameter, bukan? Melihat kesamaan di antara keduanya membantu saya memahaminya.
csjacobs24
9
Salah. Ad hoc polymorphismadalah apa yang Anda jelaskan di bagian Overloading Anda dan merupakan kasus polimorfisme.
Jossie Calderon
1
"Ini tidak terkait dengan override atau polimorfisme". Pernyataan ini salah.
Shailesh Pratapwar
45

Polimorfisme berarti lebih dari satu bentuk, objek yang sama melakukan operasi yang berbeda sesuai dengan kebutuhan.

Polimorfisme dapat dicapai dengan menggunakan dua cara, yaitu

  1. Metode penimpaan
  2. Metode kelebihan beban

Metode overloading berarti menulis dua atau lebih metode dalam kelas yang sama dengan menggunakan nama metode yang sama, tetapi parameter kelulusannya berbeda.

Metode overriding berarti kita menggunakan nama metode di kelas yang berbeda, itu berarti metode kelas induk digunakan di kelas anak.

Di Jawa untuk mencapai polimorfisme variabel referensi kelas super dapat menampung objek sub kelas.

Untuk mencapai polimorfisme, setiap pengembang harus menggunakan nama metode yang sama dalam proyek.

manoj
sumber
4
+1 untuk jawaban yang bagus. Jawaban yang diterima hanya menjelaskan satu jenis polimorfisme. Jawaban ini selesai.
apadana
1
polimorfisme adalah sebuah paradigma (OOP), tetapi overriding & overloading adalah fasilitas bahasa.
曾 其 威
Polimorfisme juga dapat dicapai dengan tipe generik.
Minh Nghĩa
43

Berikut adalah contoh polimorfisme di pseudo-C # / Java:

class Animal
{
    abstract string MakeNoise ();
}

class Cat : Animal {
    string MakeNoise () {
        return "Meow";
    }
}

class Dog : Animal {
    string MakeNoise () {
        return "Bark";
    }
}

Main () {
   Animal animal = Zoo.GetAnimal ();
   Console.WriteLine (animal.MakeNoise ());
}

Fungsi utama tidak tahu jenis hewan dan tergantung pada perilaku implementasi tertentu dari metode MakeNoise ().

Sunting: Sepertinya Brian memukul saya sampai habis. Lucu kami menggunakan contoh yang sama. Tetapi kode di atas harus membantu memperjelas konsep.

Mark A. Nicolosi
sumber
Ini adalah contoh dari polimorfisme runtime. Kompilasi polimorfisme waktu juga dimungkinkan melalui metode overloading dan tipe generik.
Pete Kirkham
Shape -> Parallelogram -> Rectangle -> Square
mpen
@ yankee2905 dalam hal ini, saya pikir Anda bisa menggunakan antarmuka, karena sebuah kelas dapat mengimplementasikan banyak antarmuka.
Sam003
1
@Zhisheng Atau menambahkan metode kencing di kelas induk abstrak? Saya akan menggunakan antarmuka untuk mengimplementasikan sesuatu yang lain.
joey rohan
42

Baik overriding maupun overloading digunakan untuk mencapai polimorfisme.

Anda bisa memiliki metode dalam kelas yang ditimpa dalam satu atau beberapa subclass. Metode ini melakukan hal yang berbeda tergantung pada kelas mana yang digunakan untuk instantiate objek.

    abstract class Beverage {
       boolean isAcceptableTemperature();
    }

    class Coffee extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature > 70;
       }
    }

    class Wine extends Beverage {
       boolean isAcceptableTemperature() { 
           return temperature < 10;
       }
    }

Anda juga bisa memiliki metode yang kelebihan muatan dengan dua atau lebih set argumen. Metode ini melakukan hal-hal yang berbeda berdasarkan jenis argumen yang diteruskan.

    class Server {
        public void pour (Coffee liquid) {
            new Cup().fillToTopWith(liquid);
        }

        public void pour (Wine liquid) {
            new WineGlass().fillHalfwayWith(liquid);
        }

        public void pour (Lemonade liquid, boolean ice) {
            Glass glass = new Glass();
            if (ice) {
                glass.fillToTopWith(new Ice());
            }
            glass.fillToTopWith(liquid);
        }
    }
Patrick McElhaney
sumber
Saya kira itu ditolak karena secara historis metode overloading tidak dianggap sebagai bagian dari polimorfisme dalam paradigma berorientasi objek. Metode overloading dan polimorfisme adalah dua fitur ortogonal, independen dari bahasa pemrograman.
Sergio Acosta
7
Seperti yang saya nyatakan dalam jawaban saya di sini, saya tidak setuju - kedua fitur itu tidak ortogonal, tetapi terkait erat. Polimorfisme! = Warisan. Anda telah memilih saya.
Peter Meyer
2
Dengan kata lain, ketik polimorfisme vs. polimorfisme ad-hoc. Saya membatalkan jawaban ini, bahkan jika tidak selengkap yang seharusnya, karena dengan benar menyatakan bahwa kelebihan beban dan penggantian terkait dengan polimorfisme. Mengatakan bahwa polimorfisme dalam bahasa OOP hanya dapat dicapai dengan pewarisan kelas adalah salah - kita harus ingat bahwa ada beberapa bahasa OOP lain selain Java dan C ++, di mana orang dapat menggunakan konsep seperti pengiriman ganda, polimorfisme ad hoc, polimorfisme parametrik dan sebagainya. .
rsenna
2
@ rsenna Ini mungkin tidak lengkap tetapi menjawab pertanyaan yang jauh lebih baik daripada IMHO lainnya. Juga, sangat bagus bahwa Anda menyebutkan polimorfisme ad-hoc dan parametrik.
Valentin Radu
15

Anda benar bahwa overloading bukan jawabannya.

Tidak ada yang mengesampingkan. Mengesampingkan adalah cara Anda mendapatkan polimorfisme. Polimorfisme adalah kemampuan suatu objek untuk memvariasikan perilaku berdasarkan jenisnya. Ini paling baik ditunjukkan ketika penelepon objek yang menunjukkan polimorfisme tidak mengetahui tipe spesifik objek tersebut.

Alex B
sumber
3
Seharusnya bukan perilaku objek yang berubah, tetapi implementasinya. Perilaku yang sama, implementasi yang berbeda, itu polimorfisme.
QBziZ
@ QBziZ Anda perlu mendefinisikan perilaku , terutama kata sifat yang sama . Jika perilakunya sama, mengapa implementasinya harus berbeda? Bukannya seseorang tidak senang dengan implementasi tertentu, karenanya membutuhkan yang berbeda.
Sнаđошƒаӽ
11

Secara khusus mengatakan overloading atau override tidak memberikan gambaran lengkap. Polimorfisme hanyalah kemampuan suatu objek untuk mengkhususkan perilakunya berdasarkan jenisnya.

Saya tidak setuju dengan beberapa jawaban di sini bahwa overloading adalah bentuk polimorfisme (parametrik polimorfisme) dalam hal suatu metode dengan nama yang sama dapat berperilaku berbeda memberikan jenis parameter yang berbeda. Contoh yang bagus adalah kelebihan operator. Anda dapat mendefinisikan "+" untuk menerima berbagai jenis parameter - misalnya string atau int - dan berdasarkan pada tipe-tipe itu, "+" akan berperilaku berbeda.

Polimorfisme juga mencakup metode pewarisan dan pengesampingan, meskipun mereka bisa abstrak atau virtual dalam tipe dasarnya. Dalam hal polimorfisme berbasis pewarisan, Java hanya mendukung pewarisan kelas tunggal yang membatasi perilaku polimorfiknya dengan rantai jenis dasar tunggal. Java mendukung implementasi beberapa antarmuka yang merupakan bentuk lain dari perilaku polimorfik.

Peter Meyer
sumber
Anda benar dalam arti kata-kata yang terlibat secara umum, tetapi dalam konteks pemrograman, ketika orang mengatakan "polimorfisme" mereka selalu berarti "polimorfisme berbasis warisan". Poin yang menarik, tapi saya pikir menggambarkan polimorfisme dengan cara ini akan membingungkan orang.
The Digital Gabeg
Mungkin lebih mudah untuk menjelaskan polimorfisme dalam hal pewarisan saja, tetapi cara pertanyaan khusus ini diajukan, saya pikir lebih bijaksana untuk menggambarkan polimorfisme parametrik juga.
Patrick McElhaney
4
Agar lebih jelas, saya pikir bentuk-bentuk yang berbeda harus dinyatakan - yang bahkan belum saya lakukan secara memadai - karena ada beberapa jawaban di sini yang disajikan sebagai absolut. Saya dengan hormat tidak setuju bahwa dalam "konteks programmer ... 'polimorfisme' selalu berarti 'polimorfisme berbasis warisan'"
Peter Meyer
2
Saya pikir kelebihan beban dikategorikan lebih baik sebagai Ad-hoc_polymorphism en.wikipedia.org/wiki/…
Manu
Saya cenderung setuju dengan 'The Digital Gabeg' untuk mengikuti. Jika Anda membahas OOP, polimorfisme biasanya berarti subtipe polimorfisme, dan jika Anda membahas tentang teori jenis, artinya semua jenis polimorfisme. Tetapi seperti yang Anda katakan, dengan 'konteks programmer' terlalu ambigu untuk diejek.
Manu
7

Polimorfisme berarti "Banyak Bentuk".

Itu tidak MEMERLUKAN warisan untuk mencapai ... karena implementasi antarmuka, yang sama sekali bukan warisan, melayani kebutuhan polimorfik. Bisa dibilang, implementasi antarmuka melayani kebutuhan polimorfik "Lebih baik" daripada warisan.

Misalnya, apakah Anda akan membuat kelas super untuk menggambarkan semua hal yang dapat terbang? Saya pikir tidak. Anda akan lebih baik dilayani untuk membuat antarmuka yang menggambarkan penerbangan dan biarkan begitu saja.

Jadi, karena antarmuka menggambarkan perilaku, dan nama metode menggambarkan perilaku (kepada programmer), tidak terlalu jauh untuk mempertimbangkan metode kelebihan beban sebagai bentuk polimorfisme yang lebih rendah.

BillC
sumber
2
Pasti jawaban terbaik. Polimorfisme dapat diterapkan pada semua konstruksi bahasa, baik itu kata benda (kelas) atau kata kerja (metode).
Radu Gasler
6

Contoh klasik, Anjing dan kucing adalah hewan, hewan memiliki metode makeNoise. Saya bisa mengulangi melalui array hewan memanggil makeNoise pada mereka dan berharap bahwa mereka akan melakukan implementasi masing-masing di sana.

Kode panggilan tidak harus tahu binatang apa itu.

Itulah yang saya anggap sebagai polimorfisme.

Brian G
sumber
4

Polimorfisme adalah kemampuan suatu objek muncul dalam berbagai bentuk. Ini melibatkan penggunaan fungsi warisan dan virtual untuk membangun sekumpulan objek yang dapat dipertukarkan. Kelas dasar berisi prototipe dari fungsi-fungsi virtual, mungkin tidak diimplementasikan atau dengan implementasi standar sebagai dikte aplikasi, dan berbagai kelas turunan masing-masing mengimplementasikannya secara berbeda untuk mempengaruhi perilaku yang berbeda.

mxg
sumber
4

Tidak ada:

Overloading adalah ketika Anda memiliki nama fungsi yang sama yang mengambil parameter berbeda.

Overriding adalah ketika kelas anak mengganti metode orang tua dengan salah satu metode sendiri (ini sendiri bukan merupakan polimorfisme).

Polimorfisme terlambat mengikat, misalnya metode kelas dasar (induk) dipanggil tetapi tidak sampai runtime aplikasi mengetahui objek sebenarnya - mungkin kelas anak yang metodenya berbeda. Ini karena setiap kelas anak dapat digunakan di mana kelas dasar didefinisikan.

Di Jawa Anda sering melihat polimorfisme dengan perpustakaan koleksi:

int countStuff(List stuff) {
  return stuff.size();
}

Daftar adalah kelas dasar, kompiler tidak memiliki petunjuk jika Anda menghitung daftar tertaut, vektor, array, atau implementasi daftar kustom, asalkan bertindak seperti Daftar:

List myStuff = new MyTotallyAwesomeList();
int result = countStuff(myStuff);

Jika Anda kelebihan beban, Anda harus:

int countStuff(LinkedList stuff) {...}
int countStuff(ArrayList stuff) {...}
int countStuff(MyTotallyAwesomeList stuff) {...}
etc...

dan versi countStuff () yang benar akan dipilih oleh kompiler agar sesuai dengan parameter.

jpeacock
sumber
4

Meskipun, Polimorfisme sudah dijelaskan dengan sangat rinci dalam posting ini tetapi saya ingin lebih menekankan mengapa bagian dari itu.

Mengapa Polimorfisme sangat penting dalam bahasa OOP.

Mari kita coba membangun aplikasi sederhana untuk TV dengan dan tanpa Warisan / Polimorfisme. Posting setiap versi aplikasi, kami melakukan retrospektif kecil.

Seandainya, Anda adalah seorang insinyur perangkat lunak di sebuah perusahaan TV dan Anda diminta untuk menulis perangkat lunak untuk pengontrol Volume, Brightness dan Color untuk menambah dan mengurangi nilainya pada perintah pengguna.

Anda mulai dengan menulis kelas untuk masing-masing fitur ini dengan menambahkan

  1. set: - Untuk menetapkan nilai controller. (Misalkan ini memiliki kode spesifik controller)
  2. dapatkan: - Untuk mendapatkan nilai controller. (Misalkan ini memiliki kode spesifik controller)
  3. sesuaikan: - Untuk memvalidasi input dan mengatur pengontrol. (Validasi umum .. independen dari pengontrol)
  4. pemetaan input pengguna dengan pengontrol: - Untuk mendapatkan input pengguna dan memanggil pengontrol sesuai.

Versi Aplikasi 1

import java.util.Scanner;    
class VolumeControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV1 {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV1    {
    private int value;
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

/*
 *       There can be n number of controllers
 * */
public class TvApplicationV1 {
    public static void main(String[] args)  {
        VolumeControllerV1 volumeControllerV1 = new VolumeControllerV1();
        BrightnessControllerV1 brightnessControllerV1 = new BrightnessControllerV1();
        ColourControllerV1 colourControllerV1 = new ColourControllerV1();


        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println("Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV1.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV1.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV1.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV1.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV1.adjust(5);
                    break;
                }
                case 6: {
                colourControllerV1.adjust(-5);
                break;
            }
            default:
                System.out.println("Shutting down...........");
                break OUTER;
        }

    }
    }
}

Sekarang Anda memiliki versi pertama aplikasi kerja kami yang siap untuk digunakan. Waktu untuk menganalisis pekerjaan yang dilakukan sejauh ini.

Masalah dalam Versi Aplikasi TV 1

  1. Menyesuaikan kode (nilai int) adalah duplikat di ketiga kelas. Anda ingin meminimalkan duplikasi kode. (Tapi Anda tidak memikirkan kode umum dan memindahkannya ke beberapa kelas super untuk menghindari kode duplikat)

Anda memutuskan untuk hidup dengan itu selama aplikasi Anda berfungsi seperti yang diharapkan.

Setelah kadang-kadang, Bos Anda kembali kepada Anda dan meminta Anda untuk menambahkan fungsi reset ke aplikasi yang ada. Reset akan mengatur ketiga kontroler ke nilai default masing-masing.

Anda mulai menulis kelas baru (ResetFunctionV2) untuk fungsionalitas baru dan memetakan kode pemetaan input pengguna untuk fitur baru ini.

Versi Aplikasi 2

import java.util.Scanner;
class VolumeControllerV2    {

    private int defaultValue = 25;
    private int value;

    int getDefaultValue() {
        return defaultValue;
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class  BrightnessControllerV2   {

    private int defaultValue = 50;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}
class ColourControllerV2    {

    private int defaultValue = 40;
    private int value;
    int get()    {
        return value;
    }
    int getDefaultValue() {
        return defaultValue;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class ResetFunctionV2 {

    private VolumeControllerV2 volumeControllerV2 ;
    private BrightnessControllerV2 brightnessControllerV2;
    private ColourControllerV2 colourControllerV2;

    ResetFunctionV2(VolumeControllerV2 volumeControllerV2, BrightnessControllerV2 brightnessControllerV2, ColourControllerV2 colourControllerV2)  {
        this.volumeControllerV2 = volumeControllerV2;
        this.brightnessControllerV2 = brightnessControllerV2;
        this.colourControllerV2 = colourControllerV2;
    }
    void onReset()    {
        volumeControllerV2.set(volumeControllerV2.getDefaultValue());
        brightnessControllerV2.set(brightnessControllerV2.getDefaultValue());
        colourControllerV2.set(colourControllerV2.getDefaultValue());
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV2 {
    public static void main(String[] args)  {
        VolumeControllerV2 volumeControllerV2 = new VolumeControllerV2();
        BrightnessControllerV2 brightnessControllerV2 = new BrightnessControllerV2();
        ColourControllerV2 colourControllerV2 = new ColourControllerV2();

        ResetFunctionV2 resetFunctionV2 = new ResetFunctionV2(volumeControllerV2, brightnessControllerV2, colourControllerV2);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV2.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV2.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV2.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV2.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV2.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV2.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV2.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Jadi, Anda sudah menyiapkan aplikasi dengan fitur Reset. Tapi, sekarang Anda mulai menyadarinya

Masalah dalam Versi Aplikasi TV 2

  1. Jika pengontrol baru diperkenalkan ke produk, Anda harus mengubah Reset kode fitur.
  2. Jika jumlah pengontrol tumbuh sangat tinggi, Anda akan memiliki masalah dalam memegang referensi pengontrol.
  3. Atur ulang kode fitur digabungkan dengan semua kode Kelas pengontrol (untuk mendapatkan dan menetapkan nilai default).
  4. Reset kelas fitur (ResetFunctionV2) dapat mengakses metode lain dari kelas Controller (sesuaikan) yang tidak diinginkan.

Pada saat yang sama, Anda mendengar dari Bos Anda bahwa Anda mungkin harus menambahkan fitur di mana masing-masing pengendali, saat start-up, perlu memeriksa versi terbaru driver dari repositori driver yang diinangi perusahaan melalui internet.

Sekarang Anda mulai berpikir bahwa fitur baru yang akan ditambahkan ini menyerupai fitur Reset dan Issue of Application (V2) akan dikalikan jika Anda tidak memasukkan kembali faktor aplikasi Anda.

Anda mulai berpikir untuk menggunakan warisan sehingga Anda dapat mengambil keuntungan dari kemampuan polimorfik JAVA dan Anda menambahkan kelas abstrak baru (ControllerV3) ke

  1. Nyatakan tanda tangan metode get and set.
  2. Berisi penyesuaian penerapan metode yang sebelumnya direplikasi di antara semua pengontrol.
  3. Deklarasikan metode setDefault sehingga fitur reset dapat dengan mudah diimplementasikan dengan memanfaatkan Polimorfisme.

Dengan peningkatan ini, Anda memiliki versi 3 aplikasi TV Anda siap dengan Anda.

Versi Aplikasi 3

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

abstract class ControllerV3 {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
    abstract void setDefault();
}
class VolumeControllerV3 extends ControllerV3   {

    private int defaultValue = 25;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
}
class  BrightnessControllerV3  extends ControllerV3   {

    private int defaultValue = 50;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }
}
class ColourControllerV3 extends ControllerV3   {

    private int defaultValue = 40;
    private int value;

    public void setDefault() {
        set(defaultValue);
    }
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
}

class ResetFunctionV3 {

    private List<ControllerV3> controllers = null;

    ResetFunctionV3(List<ControllerV3> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (ControllerV3 controllerV3 :this.controllers)  {
            controllerV3.setDefault();
        }
    }
}
/*
 *       so on
 *       There can be n number of controllers
 *
 * */
public class TvApplicationV3 {
    public static void main(String[] args)  {
        VolumeControllerV3 volumeControllerV3 = new VolumeControllerV3();
        BrightnessControllerV3 brightnessControllerV3 = new BrightnessControllerV3();
        ColourControllerV3 colourControllerV3 = new ColourControllerV3();

        List<ControllerV3> controllerV3s = new ArrayList<>();
        controllerV3s.add(volumeControllerV3);
        controllerV3s.add(brightnessControllerV3);
        controllerV3s.add(colourControllerV3);

        ResetFunctionV3 resetFunctionV3 = new ResetFunctionV3(controllerV3s);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV3.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV3.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV3.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV3.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV3.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV3.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV3.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Meskipun sebagian besar Masalah yang tercantum dalam daftar masalah V2 ditangani kecuali

Masalah dalam Versi Aplikasi TV 3

  1. Reset kelas fitur (ResetFunctionV3) dapat mengakses metode lain dari kelas Controller (sesuaikan) yang tidak diinginkan.

Sekali lagi, Anda berpikir untuk menyelesaikan masalah ini, karena sekarang Anda memiliki fitur lain (pembaruan driver saat startup) untuk diterapkan juga. Jika Anda tidak memperbaikinya, itu akan direplikasi ke fitur baru juga.

Jadi Anda membagi kontrak yang didefinisikan dalam kelas abstrak dan menulis 2 antarmuka untuk

  1. Setel ulang fitur.
  2. Pembaruan Driver.

Dan mintalah kelas beton 1 Anda mengimplementasikannya seperti di bawah ini

Versi Aplikasi 4

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

interface OnReset {
    void setDefault();
}
interface OnStart {
    void checkForDriverUpdate();
}
abstract class ControllerV4 implements OnReset,OnStart {
    abstract void set(int value);
    abstract int get();
    void adjust(int value)  {
        int temp = this.get();
        if(((value > 0) && (temp >= 100)) || ((value < 0) && (temp <= 0)))    {
            System.out.println("Can not adjust any further");
            return;
        }
        this.set(temp + value);
    }
}

class VolumeControllerV4 extends ControllerV4 {

    private int defaultValue = 25;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of VolumeController \t"+this.value);
        this.value = value;
        System.out.println("New value of VolumeController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for VolumeController .... Done");
    }
}
class  BrightnessControllerV4 extends ControllerV4 {

    private int defaultValue = 50;
    private int value;
    @Override
    int get()    {
        return value;
    }
    @Override
    void set(int value) {
        System.out.println("Old value of BrightnessController \t"+this.value);
        this.value = value;
        System.out.println("New value of BrightnessController \t"+this.value);
    }

    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for BrightnessController .... Done");
    }
}
class ColourControllerV4 extends ControllerV4 {

    private int defaultValue = 40;
    private int value;
    @Override
    int get()    {
        return value;
    }
    void set(int value) {
        System.out.println("Old value of ColourController \t"+this.value);
        this.value = value;
        System.out.println("New value of ColourController \t"+this.value);
    }
    @Override
    public void setDefault() {
        set(defaultValue);
    }

    @Override
    public void checkForDriverUpdate()    {
        System.out.println("Checking driver update for ColourController .... Done");
    }
}
class ResetFunctionV4 {

    private List<OnReset> controllers = null;

    ResetFunctionV4(List<OnReset> controllers)  {
        this.controllers = controllers;
    }
    void onReset()    {
        for (OnReset onreset :this.controllers)  {
            onreset.setDefault();
        }
    }
}
class InitializeDeviceV4 {

    private List<OnStart> controllers = null;

    InitializeDeviceV4(List<OnStart> controllers)  {
        this.controllers = controllers;
    }
    void initialize()    {
        for (OnStart onStart :this.controllers)  {
            onStart.checkForDriverUpdate();
        }
    }
}
/*
*       so on
*       There can be n number of controllers
*
* */
public class TvApplicationV4 {
    public static void main(String[] args)  {
        VolumeControllerV4 volumeControllerV4 = new VolumeControllerV4();
        BrightnessControllerV4 brightnessControllerV4 = new BrightnessControllerV4();
        ColourControllerV4 colourControllerV4 = new ColourControllerV4();
        List<ControllerV4> controllerV4s = new ArrayList<>();
        controllerV4s.add(brightnessControllerV4);
        controllerV4s.add(volumeControllerV4);
        controllerV4s.add(colourControllerV4);

        List<OnStart> controllersToInitialize = new ArrayList<>();
        controllersToInitialize.addAll(controllerV4s);
        InitializeDeviceV4 initializeDeviceV4 = new InitializeDeviceV4(controllersToInitialize);
        initializeDeviceV4.initialize();

        List<OnReset> controllersToReset = new ArrayList<>();
        controllersToReset.addAll(controllerV4s);
        ResetFunctionV4 resetFunctionV4 = new ResetFunctionV4(controllersToReset);

        OUTER: while(true) {
            Scanner sc=new Scanner(System.in);
            System.out.println(" Enter your option \n Press 1 to increase volume \n Press 2 to decrease volume");
            System.out.println(" Press 3 to increase brightness \n Press 4 to decrease brightness");
            System.out.println(" Press 5 to increase color \n Press 6 to decrease color");
            System.out.println(" Press 7 to reset TV \n Press any other Button to shutdown");
            int button = sc.nextInt();
            switch (button) {
                case  1:    {
                    volumeControllerV4.adjust(5);
                    break;
                }
                case 2: {
                    volumeControllerV4.adjust(-5);
                    break;
                }
                case  3:    {
                    brightnessControllerV4.adjust(5);
                    break;
                }
                case 4: {
                    brightnessControllerV4.adjust(-5);
                    break;
                }
                case  5:    {
                    colourControllerV4.adjust(5);
                    break;
                }
                case 6: {
                    colourControllerV4.adjust(-5);
                    break;
                }
                case 7: {
                    resetFunctionV4.onReset();
                    break;
                }
                default:
                    System.out.println("Shutting down...........");
                    break OUTER;
            }

        }
    }
}

Sekarang semua masalah yang Anda hadapi telah diatasi dan Anda menyadari bahwa dengan menggunakan Warisan dan Polimorfisme Anda dapat

  1. Menyimpan berbagai bagian aplikasi secara longgar. (Komponen fitur Reset atau Driver Update tidak perlu dibuat sadar akan kelas-kelas pengontrol yang sebenarnya (Volume, Brightness dan Color), setiap kelas yang mengimplementasikan OnReset atau OnStart akan dapat diterima untuk fitur Reset atau Driver Update masing-masing komponen).
  2. Peningkatan aplikasi menjadi lebih mudah. ​​(Tambahan baru controller tidak akan mengatur ulang dampak atau komponen fitur pembaruan driver, dan sekarang sangat mudah bagi Anda untuk menambahkan yang baru)
  3. Pertahankan lapisan abstraksi. (Sekarang fitur Reset hanya dapat melihat metode setDefault dari pengontrol dan fitur Reset hanya dapat melihat metode checkForDriverUpdate dari pengontrol)

Semoga ini membantu :-)

Pengembang
sumber
3

Istilah overloading mengacu pada memiliki beberapa versi sesuatu dengan nama yang sama, biasanya metode dengan daftar parameter yang berbeda

public int DoSomething(int objectId) { ... }
public int DoSomething(string objectName) { ... }

Jadi fungsi-fungsi ini mungkin melakukan hal yang sama tetapi Anda memiliki opsi untuk menyebutnya dengan ID, atau nama. Tidak ada hubungannya dengan warisan, kelas abstrak, dll.

Overriding biasanya merujuk pada polimorfisme, seperti yang Anda jelaskan dalam pertanyaan Anda

Clyde
sumber
2

overloading adalah ketika Anda mendefinisikan 2 metode dengan nama yang sama tetapi parameter yang berbeda

overriding adalah tempat Anda mengubah perilaku kelas dasar melalui fungsi dengan nama yang sama di subkelas.

Jadi Polimorfisme terkait dengan mengesampingkan tetapi tidak terlalu berlebihan.

Namun, jika seseorang memberi saya jawaban sederhana "penggantian" untuk pertanyaan "Apa itu polimorfisme?" Saya akan meminta penjelasan lebih lanjut.

Mat
sumber
2

overriding lebih seperti menyembunyikan metode yang diwariskan dengan mendeklarasikan metode dengan nama dan tanda tangan yang sama dengan metode tingkat atas (metode super), ini menambahkan perilaku polimorfik ke kelas. dengan kata lain keputusan untuk memilih metode level mana yang akan dipanggil akan dibuat pada saat run time bukan pada waktu kompilasi. ini mengarah pada konsep antarmuka dan implementasi.

Genjuro
sumber
2

apa itu polimorfisme?

Dari tutorial java

Definisi kamus polimorfisme mengacu pada prinsip dalam biologi di mana organisme atau spesies dapat memiliki berbagai bentuk atau tahapan. Prinsip ini juga dapat diterapkan pada pemrograman dan bahasa berorientasi objek seperti bahasa Java. Subkelas kelas dapat menentukan perilaku unik mereka sendiri dan berbagi fungsi yang sama dari kelas induk.

Dengan mempertimbangkan contoh dan definisi, jawaban utama harus diterima.

Mengenai permintaan kedua Anda:

JIKA Anda memiliki kelas dasar abstrak yang mendefinisikan metode tanpa implementasi, dan Anda mendefinisikan metode itu dalam sub kelas, apakah itu masih menimpa?

Itu harus disebut overriding.

Lihat contoh ini untuk memahami berbagai jenis pengesampingan.

  1. Kelas dasar tidak menyediakan implementasi dan sub-kelas harus menimpa metode lengkap - (abstrak)
  2. Kelas dasar menyediakan implementasi standar dan sub-kelas dapat mengubah perilaku
  3. Subkelas menambahkan ekstensi ke implementasi kelas dasar dengan memanggil super.methodName() sebagai pernyataan pertama
  4. Kelas dasar mendefinisikan struktur algoritma (metode Templat) dan sub-kelas akan menimpa bagian dari algoritma

cuplikan kode:

import java.util.HashMap;

abstract class Game implements Runnable{

    protected boolean runGame = true;
    protected Player player1 = null;
    protected Player player2 = null;
    protected Player currentPlayer = null;

    public Game(){
        player1 = new Player("Player 1");
        player2 = new Player("Player 2");
        currentPlayer = player1;
        initializeGame();
    }

    /* Type 1: Let subclass define own implementation. Base class defines abstract method to force
        sub-classes to define implementation    
    */

    protected abstract void initializeGame();

    /* Type 2: Sub-class can change the behaviour. If not, base class behaviour is applicable */
    protected void logTimeBetweenMoves(Player player){
        System.out.println("Base class: Move Duration: player.PlayerActTime - player.MoveShownTime");
    }

    /* Type 3: Base class provides implementation. Sub-class can enhance base class implementation by calling
        super.methodName() in first line of the child class method and specific implementation later */
    protected void logGameStatistics(){
        System.out.println("Base class: logGameStatistics:");
    }
    /* Type 4: Template method: Structure of base class can't be changed but sub-class can some part of behaviour */
    protected void runGame() throws Exception{
        System.out.println("Base class: Defining the flow for Game:");  
        while ( runGame) {
            /*
            1. Set current player
            2. Get Player Move
            */
            validatePlayerMove(currentPlayer);  
            logTimeBetweenMoves(currentPlayer);
            Thread.sleep(500);
            setNextPlayer();
        }
        logGameStatistics();
    }
    /* sub-part of the template method, which define child class behaviour */
    protected abstract void validatePlayerMove(Player p);

    protected void setRunGame(boolean status){
        this.runGame = status;
    }
    public void setCurrentPlayer(Player p){
        this.currentPlayer = p;
    }
    public void setNextPlayer(){
        if ( currentPlayer == player1) {
            currentPlayer = player2;
        }else{
            currentPlayer = player1;
        }
    }
    public void run(){
        try{
            runGame();
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

class Player{
    String name;
    Player(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}

/* Concrete Game implementation  */
class Chess extends Game{
    public Chess(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized Chess game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate Chess move:"+p.getName());
    }
    protected void logGameStatistics(){
        super.logGameStatistics();
        System.out.println("Child class: Add Chess specific logGameStatistics:");
    }
}
class TicTacToe extends Game{
    public TicTacToe(){
        super();
    }
    public void initializeGame(){
        System.out.println("Child class: Initialized TicTacToe game");
    }
    protected void validatePlayerMove(Player p){
        System.out.println("Child class: Validate TicTacToe move:"+p.getName());
    }
}

public class Polymorphism{
    public static void main(String args[]){
        try{

            Game game = new Chess();
            Thread t1 = new Thread(game);
            t1.start();
            Thread.sleep(1000);
            game.setRunGame(false);
            Thread.sleep(1000);

            game = new TicTacToe();
            Thread t2 = new Thread(game);
            t2.start();
            Thread.sleep(1000);
            game.setRunGame(false);

        }catch(Exception err){
            err.printStackTrace();
        }       
    }
}

keluaran:

Child class: Initialized Chess game
Base class: Defining the flow for Game:
Child class: Validate Chess move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate Chess move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:
Child class: Add Chess specific logGameStatistics:
Child class: Initialized TicTacToe game
Base class: Defining the flow for Game:
Child class: Validate TicTacToe move:Player 1
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Child class: Validate TicTacToe move:Player 2
Base class: Move Duration: player.PlayerActTime - player.MoveShownTime
Base class: logGameStatistics:
Ravindra babu
sumber
2

Saya pikir kalian adalah konsep campuran. Polimorfisme adalah kemampuan suatu objek untuk berperilaku berbeda pada saat run time. Untuk mencapai ini, Anda perlu dua syarat:

  1. Binding Terlambat
  2. Warisan.

Setelah mengatakan bahwa overloading berarti sesuatu yang berbeda untuk mengesampingkan tergantung pada bahasa yang Anda gunakan. Misalnya di Java tidak ada overriding tetapi overloading . Metode kelebihan beban dengan tanda tangan yang berbeda dengan kelas dasarnya tersedia di subkelas. Kalau tidak, mereka akan diganti (tolong, lihat yang saya maksud sekarang fakta tidak ada cara untuk memanggil metode kelas dasar Anda dari luar objek).

Namun dalam C ++ tidak demikian. Setiap kelebihan beban metode, secara independen apakah tanda tangan adalah (jumlah diffrrent, jenis yang berbeda) yang sama atau tidak juga diganti . Itu untuk hari ini, metode kelas dasar 'tidak lagi tersedia di subclass ketika dipanggil dari luar objek subclass, jelas.

Jadi jawabannya adalah ketika berbicara tentang Java menggunakan overloading . Dalam bahasa lain mungkin berbeda seperti yang terjadi di c ++

pengguna1154840
sumber
1

Polimorfisme lebih mungkin sejauh artinya terkait ... TERLALU di Jawa

Ini semua tentang perilaku yang berbeda dari objek SAMA dalam situasi yang berbeda (Dengan cara pemrograman ... Anda dapat memanggil ARGUMEN yang berbeda)

Saya pikir contoh di bawah ini akan membantu Anda untuk memahami ... Meskipun bukan kode java MURNI ...

     public void See(Friend)
     {
        System.out.println("Talk");
     }

Tetapi jika kita mengubah ARGUMENT ... PERILAKU akan diubah ...

     public void See(Enemy)
     {
        System.out.println("Run");
     }

Orang (di sini "Objek") sama ...

Rajan
sumber
1

Polimorfisme adalah implementasi beberapa objek atau Anda bisa mengatakan beberapa bentuk objek. katakanlah Anda memiliki kelas Animalssebagai kelas dasar abstrak dan memiliki metode yang disebut movement()yang mendefinisikan cara hewan bergerak. Sekarang pada kenyataannya kita memiliki berbagai jenis hewan dan mereka bergerak secara berbeda juga beberapa dari mereka dengan 2 kaki, yang lain dengan 4 dan beberapa tanpa kaki, dll. Untuk mendefinisikan berbeda movement()dari setiap hewan di bumi, kita perlu menerapkan polimorfisme. Namun, Anda perlu mendefinisikan lebih banyak kelas yaitu kelas Dogs Cats Fishdll. Kemudian Anda perlu memperluas kelas-kelas tersebut dari kelas dasar Animalsdan mengganti metodenya movement()dengan fungsionalitas gerakan baru berdasarkan pada masing-masing hewan yang Anda miliki. Anda juga bisa menggunakanInterfacesuntuk mencapai itu. Kata kunci di sini menimpa, overload berbeda dan tidak dianggap sebagai polimorfisme. dengan overloading Anda dapat mendefinisikan beberapa metode "dengan nama yang sama" tetapi dengan parameter yang berbeda pada objek atau kelas yang sama.

SolidSnake
sumber
0

Polimorfisme berhubungan dengan kemampuan suatu bahasa untuk memiliki objek yang berbeda diperlakukan secara seragam dengan menggunakan antarmuka tunggal; karena itu terkait dengan penggantian, sehingga antarmuka (atau kelas dasar) adalah polimorfik, implementor adalah objek yang menimpa (dua wajah dari medali yang sama)

Lagi pula, perbedaan antara dua istilah lebih baik dijelaskan menggunakan bahasa lain, seperti c ++: objek polimorfik dalam c ++ berperilaku sebagai mitra java jika fungsi dasar adalah virtual, tetapi jika metode ini bukan virtual lompatan kode diselesaikan secara statis , dan tipe sebenarnya tidak dicentang pada saat runtime demikian, polimorfisme mencakup kemampuan suatu objek untuk berperilaku berbeda tergantung pada antarmuka yang digunakan untuk mengaksesnya; izinkan saya membuat contoh di pseudocode:

class animal {
    public void makeRumor(){
        print("thump");
    }
}
class dog extends animal {
    public void makeRumor(){
        print("woff");
    }
}

animal a = new dog();
dog b = new dog();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

(Andaikan makeRumor BUKAN virtual)

java tidak benar-benar menawarkan tingkat polimorfisme ini (disebut juga pemotongan objek).

hewan a = anjing baru (); anjing b = anjing baru ();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

pada kedua kasus itu hanya akan mencetak woff .. karena a dan b mengacu pada anjing kelas

Lorenzo Boccaccia
sumber
hewan a = anjing baru (); a dibangun sebagai anjing, dan akan mencetak "woff". Jika Anda ingin mencetak buk maka Anda perlu membuangnya. ((Hewan) a) .makeRumor ()
Chris Cudmore
Itu referensi upcasting, tetapi objeknya masih seekor anjing. Jika Anda ingin menjadi binatang, Anda harus secara eksplisit mengirim objek.
Chris Cudmore
Menemukannya. Pertanyaan diberi tag Java. Anda menjawab C ++. Anda mungkin benar dalam C ++. Saya benar di Jawa.
Chris Cudmore
harus terjadi setiap kali copy constructor dilibatkan di sini adalah referensi fredosaurus.com/notes-cpp/oop-condestructors/… kasus tiga pertandingan; abaikan operator baru yang hanya ada untuk menciptakan disambiguasi.
Lorenzo Boccaccia
0
import java.io.IOException;

class Super {

    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName() + " - I'm parent");
        return null;
    }

}

class SubOne extends Super {

    @Override
    protected Super getClassName(Super s)  {
        System.out.println(this.getClass().getSimpleName() + " - I'm Perfect Overriding");
        return null;
    }

}

class SubTwo extends Super {

    @Override
    protected Super getClassName(Super s) throws NullPointerException {
        System.out.println(this.getClass().getSimpleName() + " - I'm Overriding and Throwing Runtime Exception");
        return null;
    }

}

class SubThree extends Super {

    @Override
    protected SubThree getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Returning SubClass Type");
        return null;
    }

}

class SubFour extends Super {

    @Override
    protected Super getClassName(Super s) throws IOException {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and Throwing Narrower Exception ");
        return null;
    }

}

class SubFive extends Super {

    @Override
    public Super getClassName(Super s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Overriding and have broader Access ");
        return null;
    }

}

class SubSix extends Super {

    public Super getClassName(Super s, String ol) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading ");
        return null;
    }

}

class SubSeven extends Super {

    public Super getClassName(SubSeven s) {
        System.out.println(this.getClass().getSimpleName()+ " - I'm Perfect Overloading because Method signature (Argument) changed.");
        return null;
    }

}

public class Test{

    public static void main(String[] args) throws Exception {

        System.out.println("Overriding\n");

        Super s1 = new SubOne(); s1.getClassName(null);

        Super s2 = new SubTwo(); s2.getClassName(null);

        Super s3 = new SubThree(); s3.getClassName(null);

        Super s4 = new SubFour(); s4.getClassName(null);

        Super s5 = new SubFive(); s5.getClassName(null);

        System.out.println("Overloading\n");

        SubSix s6 = new SubSix(); s6.getClassName(null, null);

        s6 = new SubSix(); s6.getClassName(null);

        SubSeven s7 = new SubSeven(); s7.getClassName(s7);

        s7 = new SubSeven(); s7.getClassName(new Super());

    }
}
bharanitharan
sumber