Apa itu polimorfisme, untuk apa itu, dan bagaimana ia digunakan?

564

Apa itu polimorfisme, untuk apa itu, dan bagaimana ia digunakan?

UnkwnTech
sumber
19
@ John: +1 Saya setuju itu adalah fenomena yang paling menarik. Saya yakin Unkwntech bukan satu-satunya orang yang memiliki pengetahuan dan kemampuan untuk memiliki kesenjangan dalam apa yang orang lain anggap sebagai kosa kata mendasar. Hanya pergi untuk menunjukkan pemrograman adalah subjek yang sangat luas.
AnthonyWJones
9
Dia mungkin menggunakannya, hanya saja tidak memberi nama.
Aiden Bell
10
@ Amir: Saya tidak yakin beralasan untuk menganggap bahwa seseorang dengan 8k akan mengetahui semua dasar di semua area pemrograman. Juga saya tidak berpikir itu menunjukkan sistem reputasi tidak sempurna. Seseorang dapat memperoleh reputasi yang cukup besar dengan mengajukan banyak pertanyaan bagus. Saya pikir tanggapan alami kita terhadap wahyu ini hanya menunjukkan bahwa kita (programmer) memiliki kecenderungan alami untuk menjadi sedikit berpikiran sempit (bukan hal yang buruk ketika kita harus benar-benar baik dalam beberapa bidang teknis tertentu) dan yang memiliki kelemahan.
AnthonyWJones
43
Kalian tampaknya memiliki pandangan yang sangat terbatas tentang pemrograman. Saya tahu orang-orang yang melakukan pengembangan tertanam yang tidak memiliki pengetahuan tentang (atau perlu) konsep OO sama sekali. Catatan singkat mereka adalah memeras setiap atom kinerja terakhir dari kode dan hanya itu - kode yang mereka kerjakan tidak akan pernah memasuki dunia objek, dan mereka untungnya cukup dekat untuk pensiun sehingga mereka tidak perlu khawatir tentang belajar konsep-konsep baru-fangled seperti objek, polimorfisme dan nama variabel dengan lebih dari dua huruf :-)
paxdiablo
29
Bagaimana cara Anda belajar sesuatu? Tidak ada yang datang ke dunia ini dengan mengetahui PHP OOP dan pola desain, jadi kalian semua harus mempelajarinya, di perguruan tinggi, jawabannya di sini, dll. Jangan bicara tentang seseorang "berani belum tahu prosedur kode yang rumit ", dan sebagai gantinya menganggap mereka di sini ingin mempelajarinya, yang merupakan hal yang baik & penting dari situs ini. Gunakan waktu Anda untuk membantu mereka, karena saya yakin Anda pernah terbantu di masa lalu. Jika sepanjang sejarah manusia, alih-alih berbagi pengetahuan, jawabannya adalah "Apa? Ha! Anda tidak tahu itu? .." kita semua masih berada di zaman kegelapan ..
James

Jawaban:

544

Jika Anda berpikir tentang akar kata Yunani, itu harus menjadi jelas.

  • Poli = banyak: poligon = banyak-sisi, polistirena = banyak styrenes (a) , poliglot = banyak bahasa, dan sebagainya.
  • Morph = perubahan atau bentuk: morfologi = studi tentang bentuk biologis, Morpheus = dewa mimpi Yunani dapat mengambil bentuk apa pun.

Jadi polimorfisme adalah kemampuan (dalam pemrograman) untuk menyajikan antarmuka yang sama untuk berbagai bentuk mendasar (tipe data).

Misalnya, dalam banyak bahasa, bilangan bulat dan float secara implisit bersifat polimorfik karena Anda dapat menambah, mengurangi, mengalikan, dan sebagainya, terlepas dari fakta bahwa jenisnya berbeda. Mereka jarang dianggap sebagai objek dalam istilah yang biasa.

Tetapi, dengan cara yang sama, kelas menyukai BigDecimalatau Rationalatau Imaginaryjuga dapat menyediakan operasi tersebut, meskipun mereka beroperasi pada tipe data yang berbeda.

Contoh klasik adalah Shapekelas dan semua kelas yang dapat mewarisi darinya (persegi, lingkaran, dodecahedron, poligon tidak beraturan, percikan dan sebagainya).

Dengan polimorfisme, masing-masing kelas ini akan memiliki data dasar yang berbeda. Bentuk titik hanya membutuhkan dua koordinat (dengan asumsi itu tentu saja dalam ruang dua dimensi). Lingkaran membutuhkan pusat dan jari-jari. Sebuah persegi atau persegi panjang membutuhkan dua koordinat untuk sudut kiri atas dan kanan bawah dan (mungkin) rotasi. Poligon tidak teratur membutuhkan serangkaian garis.

Dengan membuat kelas bertanggung jawab atas kode serta datanya, Anda dapat mencapai polimorfisme. Dalam contoh ini, setiap kelas akan memiliki fungsinya sendiri Draw()dan kode klien dapat melakukannya:

shape.Draw()

untuk mendapatkan perilaku yang benar untuk bentuk apa pun.

Ini berbeda dengan cara lama dalam melakukan hal-hal di mana kode terpisah dari data, dan Anda akan memiliki fungsi seperti drawSquare()dan drawCircle().

Orientasi objek, polimorfisme, dan pewarisan semuanya adalah konsep yang berkaitan erat dan sangat penting untuk diketahui. Ada banyak "peluru perak" selama karir panjang saya yang pada dasarnya hanya gagal tetapi paradigma OO ternyata bagus. Pelajari, pahami, menyukainya - Anda akan senang melakukannya :-)


(a) Saya awalnya menulis itu sebagai lelucon tetapi ternyata itu benar dan, karenanya, tidak lucu. Styrene monomer terbuat dari karbon dan hidrogen , dan polistirena dibuat dari kelompok-kelompok itu ,.C8H8(C8H8)n

Mungkin saya seharusnya menyatakan bahwa polip adalah banyak kemunculan surat itu pmeskipun, sekarang saya harus menjelaskan leluconnya, bahkan itu juga tidak lucu.

Terkadang, Anda harus berhenti saat Anda berada di belakang :-)

paxdiablo
sumber
50
Yunani, bukan Latin :) ('y' dan 'ph' adalah hadiahnya). Dan dalam bahasa Yunani, 'morph-' hanya 'bentuk', atau 'bentuk' - arti bahasa Inggris dari ' perubahan bentuk' untuk 'morph' adalah perkembangan selanjutnya
AakashM
16
Polimorfisme tidak terkait dengan OOP, tetapi OOP terkait dengan polimorfisme karena ia secara inheren mendukungnya (dengan asumsi itu adalah bahasa OOP yang layak). Lihatlah FP untuk contoh polimorfisme lainnya.
alternatif
9
2 baris ini membantu saya:Poly = many and Morph = change or form
Jo Smo
3
Polyp adalah kependekan dari polypo (u) s. Dan pous adalah kaki di Yunani. ;-)
Dirk
2
@Shaun, saya pikir Anda mungkin menggunakan istilah "antarmuka" dalam arti yang terlalu literal / konstriktif - maksud saya sebagai istilah bahasa Inggris dan bukan definisi yang spesifik untuk beberapa bahasa komputer yang sewenang-wenang. Itu tidak berarti fungsi yang persis sama dengan parameter yang persis sama, itu hanya cara mempengaruhi "objek" dengan cara yang sama terlepas dari jenis beton yang mendasarinya. Ini dapat mencakup metode overloading dengan tipe parameter yang berbeda serta bentuk polimorfisme yang lebih murni.
paxdiablo
250

Polimorfisme adalah ketika Anda dapat memperlakukan objek sebagai versi generik dari sesuatu, tetapi ketika Anda mengaksesnya, kode menentukan jenis persisnya dan memanggil kode yang terkait.

Berikut adalah contoh dalam C #. Buat empat kelas dalam aplikasi konsol:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Sekarang buat yang berikut di Main () dari modul untuk aplikasi konsol:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

Dalam contoh ini, kami membuat daftar Kendaraan kelas dasar, yang tidak tahu tentang berapa banyak roda yang dimiliki masing-masing sub-kelasnya, tetapi kami tahu bahwa setiap sub-kelas bertanggung jawab untuk mengetahui berapa banyak roda yang dimilikinya.

Kami kemudian menambahkan Sepeda, Mobil, dan Truk ke dalam daftar.

Selanjutnya, kita dapat mengulangi setiap Kendaraan dalam daftar, dan memperlakukan mereka semua secara identik, namun ketika kita mengakses setiap properti Roda 'Kendaraan, kelas Kendaraan mendelegasikan eksekusi kode tersebut ke sub-kelas yang relevan.

Kode ini dikatakan polimorfik, karena kode pasti yang dijalankan ditentukan oleh sub-kelas yang direferensikan saat runtime.

Saya harap ini membantu Anda.

Antony Gibbs
sumber
6
Saya pikir ini adalah contoh yang sangat baik untuk menunjukkan dengan jelas antarmuka orang tua, dan bahwa tidak sampai objek instantiated bahwa versi konkret diperlukan, yaitu kendaraan vs mobil
kabel00
1
Saya akan mengatakan ini adalah contoh paling jelas, meskipun jika Anda seorang programmer PHP tautan ini mungkin lebih mudah untuk ditinjau PERTAMA, dan kemudian masih melihat yang satu ini setelah: code.tutsplus.com/tutorials/…
Oliver Williams
Juga (di luar cakupan OP) untuk mencatat bahwa kami membatasi analisis untuk objek yang diketahui; kita tidak melewatkan objek (seperti file impor) dan kemudian menentukan jenisnya (Excel, CSV, YAML, SQL, dll.). Untuk melakukan ini diperlukan kelas pabrik untuk Class_Excel, Class_CSVdipanggil, atau Readerdipanggil kelas. Either way, semacam iteratif jika / then / else harus disimpan di suatu tempat.
Oliver Williams
@Antony Gibbs: ini adalah contoh yang sangat bagus (daftar tipe generik) yang masuk akal bagi saya .... kalau tidak apa masalahnya memiliki setiap kelas memiliki fungsi roda sendiri tanpa mewarisi dari kelas dasar? Apakah ada konsep lain selain daftar yang akan baik untuk polimorfik?
TTT
195

Dari Memahami dan Menerapkan Polimorfisme dalam PHP , Terima kasih Steve Guidetti.

Polimorfisme adalah kata yang panjang untuk konsep yang sangat sederhana.

Polimorfisme menjelaskan suatu pola dalam pemrograman berorientasi objek di mana kelas-kelas memiliki fungsi yang berbeda sambil berbagi antarmuka yang sama.

Keindahan polimorfisme adalah bahwa kode yang bekerja dengan kelas yang berbeda tidak perlu tahu kelas mana yang digunakan karena mereka semua menggunakan cara yang sama. Analogi dunia nyata untuk polimorfisme adalah sebuah tombol. Semua orang tahu cara menggunakan tombol: Anda cukup menekannya. Apa yang "dilakukan" tombol, tergantung pada apa yang terhubung dan konteks di mana ia digunakan - tetapi hasilnya tidak mempengaruhi bagaimana itu digunakan. Jika bos Anda memberi tahu Anda untuk menekan tombol, Anda sudah memiliki semua informasi yang diperlukan untuk melakukan tugas itu.

Dalam dunia pemrograman, polimorfisme digunakan untuk membuat aplikasi lebih modular dan dapat dikembangkan. Alih-alih pernyataan bersyarat berantakan menggambarkan berbagai tindakan, Anda membuat objek dipertukarkan yang Anda pilih berdasarkan kebutuhan Anda. Itulah tujuan dasar polimorfisme.

Ajay Patel
sumber
10
bukankah analogi tombol lebih terkait dengan konsep abstraksi?
thewpfguy
6
Sumber asli: code.tutsplus.com/tutorials/…
Seseorang
8
@Mantriur: Ini memang dijiplak, dan kami memiliki aturan yang menentangnya: stackoverflow.com/help/referencing Tetapi mengingat nilainya sekarang dan fakta bahwa posting lama dikecualikan dari kehilangan kerugian pada penghapusan jawaban, saya tidak yakin apakah menghapusnya sekarang langsung akan meningkatkan apa pun. Alternatif terbaik berikutnya adalah dengan mengedit atribusi atas nama pengguna, meskipun saya sangat percaya pengguna bertanggung jawab untuk mengutip sumber dalam jawaban mereka sendiri.
BoltClock
1
Saya percaya itu tidak benar untuk menyiratkan bahwa polimorfisme khusus untuk kelas dan / atau pemrograman berorientasi objek, melihat bagaimana polimorfisme ad hoc atau polimorfisme parametrik tidak selalu memerlukan kelas dan / atau objek. Saya pikir apa jawaban yang dibicarakan ini adalah subtyping (juga dikenal sebagai subtipe polimorfisme atau polimorfisme inklusi).
StubbornShowaGuy
64

Jika ada yang mengatakan CUT kepada orang-orang ini

  1. Ahli bedah
  2. Penata Rambut
  3. Aktor

Apa yang akan terjadi?

  • Dokter bedah akan mulai membuat sayatan.
  • Penata Rambut akan mulai memotong rambut seseorang.
  • Aktor itu tiba-tiba akan berhenti bertindak keluar dari adegan saat ini, menunggu arahan sutradara.

Jadi representasi di atas menunjukkan Apa itu polimorfisme (nama yang sama, perilaku yang berbeda) dalam OOP.

Jika Anda pergi untuk wawancara dan pewawancara meminta Anda memberi tahu / menunjukkan contoh langsung untuk polimorfisme di ruangan yang sama dengan tempat kami duduk, katakan-

Jawaban - Pintu / Windows

Bingung Bagaimana?

Melalui Pintu / Jendela - seseorang bisa datang, udara bisa datang, cahaya bisa datang, hujan bisa datang, dll.

Untuk memahaminya dengan lebih baik dan secara sederhana saya menggunakan contoh di atas .. Jika Anda memerlukan referensi untuk kode ikuti jawaban di atas.

Sanchit
sumber
5
Saya tidak berpikir ini adalah contoh yang bagus karena dapat menyebabkan orang yang tidak berpengalaman berpikir bahwa jika dua kelas memiliki .foo()metode, maka mereka harus berbagi antarmuka yang sama. Namun, ini tidak benar dan mengarah ke abstraksi yang salah. Antarmuka harus mendefinisikan peran yang harus dimainkan, yang mungkin memiliki banyak implementasi yang berbeda, tetapi semua menarik dari set input yang sama dan mengembalikan sesuatu dari set output yang sama. Input ke dalam x.cut(...)untuk ahli bedah, stylist, atau aktor tidak sama, dan tidak pula hasilnya.
Matt Klein
37

Penjelasan sederhana dengan analogi

Presiden Amerika Serikat menggunakan polimorfisme. Bagaimana? Yah, dia punya banyak penasihat:

  1. Penasihat Militer
  2. Penasihat Hukum
  3. Fisikawan nuklir (sebagai penasihat)
  4. Penasihat medis
  5. dll.

Setiap orang seharusnya hanya bertanggung jawab atas satu hal: Contoh

Presiden bukan ahli dalam pelapisan seng, atau fisika kuantum. Dia tidak tahu banyak hal - tetapi dia hanya tahu satu hal: bagaimana mengatur negara.

Agak sama dengan kode: masalah dan tanggung jawab harus dipisahkan ke kelas / orang yang relevan. Kalau tidak, Anda akan memiliki presiden yang mengetahui segala sesuatu di dunia secara harfiah - seluruh Wikipedia. Bayangkan memiliki seluruh wikipedia di kelas kode Anda: itu akan menjadi mimpi buruk untuk dipertahankan.

Mengapa itu adalah ide yang buruk bagi seorang presiden untuk mengetahui semua hal spesifik ini?

Jika presiden secara khusus memberi tahu orang apa yang harus dilakukan, itu berarti bahwa presiden perlu tahu persis apa yang harus dilakukan. Jika presiden perlu mengetahui hal-hal spesifik sendiri, itu berarti bahwa ketika Anda perlu melakukan perubahan, maka Anda harus membuatnya di dua tempat, bukan hanya satu.

Misalnya, jika EPA mengubah undang-undang polusi maka ketika itu terjadi: Anda harus membuat perubahan ke Kelas EPA dan juga kelas Presiden. Mengubah kode di dua tempat daripada satu bisa berbahaya - karena jauh lebih sulit untuk dipelihara.

Apakah ada pendekatan yang lebih baik?

Ada pendekatan yang lebih baik: presiden tidak perlu mengetahui secara spesifik apa pun - dia dapat meminta saran terbaik, dari orang-orang yang secara khusus ditugaskan untuk melakukan hal-hal itu.

Dia dapat menggunakan pendekatan polimorfik untuk menjalankan negara.

Contoh - menggunakan pendekatan polimorfik:

Yang dilakukan presiden adalah meminta orang untuk menasihatinya - dan itulah yang sebenarnya dia lakukan dalam kehidupan nyata - dan itulah yang harus dilakukan oleh presiden yang baik. semua penasihatnya merespons secara berbeda, tetapi mereka semua tahu apa yang dimaksud presiden dengan: Advise (). Dia punya ratusan orang mengalir ke kantornya. Sebenarnya tidak masalah siapa mereka.Yang diketahui presiden hanyalah ketika dia meminta mereka untuk "memberi nasihat" mereka tahu bagaimana harus menanggapi :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

Pendekatan ini memungkinkan presiden untuk menjalankan negara secara harfiah tanpa mengetahui apa pun tentang hal-hal militer, atau perawatan kesehatan atau diplomasi internasional: rinciannya diserahkan kepada para ahli. Satu-satunya hal yang perlu diketahui oleh presiden adalah ini: "Advise ()".

Apa yang TIDAK ANDA inginkan:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

TIDAK! TIDAK! TIDAK! Dalam skenario di atas, presiden melakukan semua pekerjaan: dia tahu tentang peningkatan jumlah pasukan dan kondisi yang sudah ada sebelumnya. Ini berarti bahwa jika kebijakan timur tengah berubah, maka presiden harus mengubah perintahnya, serta kelas Petraeus juga. Kita hanya perlu mengubah kelas Petraeus, karena Presiden seharusnya tidak harus terjebak dalam detail seperti itu. Dia tidak perlu tahu tentang detailnya. Yang perlu dia ketahui adalah bahwa jika dia membuat satu pesanan, semuanya akan diurus. Semua detail harus diserahkan kepada para ahli.

Ini memungkinkan presiden untuk melakukan yang terbaik: menetapkan kebijakan umum, berpenampilan baik dan bermain golf: P.

Bagaimana sebenarnya diimplementasikan - melalui kelas dasar atau antarmuka umum

Yang berlaku adalah polimorfisme, singkatnya. Bagaimana tepatnya hal itu dilakukan? Melalui "mengimplementasikan antarmuka umum" atau dengan menggunakan kelas dasar (pewarisan) - lihat jawaban di atas yang merinci ini lebih jelas. (Untuk memahami konsep ini dengan lebih jelas, Anda perlu tahu apa antarmuka itu, dan Anda perlu memahami apa itu warisan. Tanpa itu, Anda mungkin kesulitan.)

Dengan kata lain, Petraeus, Condi dan HealthOfficials semua akan kelas yang "mengimplementasikan antarmuka" - panggilan mari itu yang IAdvisorantarmuka yang hanya berisi satu metode: Advise(). Tapi sekarang kita masuk ke spesifik.

Ini akan ideal

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that's all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Ringkasan

Yang perlu Anda ketahui hanyalah ini:

  • Presiden tidak perlu tahu secara spesifik - itu diserahkan kepada orang lain.
  • Yang perlu diketahui oleh presiden adalah bertanya siapa yang pernah berjalan di pintu untuk menasihatinya - dan kita tahu bahwa mereka akan benar-benar tahu apa yang harus dilakukan ketika diminta untuk memberi nasihat (karena mereka semua dalam aktualitas, penasihat (atau IAdvisors :))

Saya sangat berharap ini membantu Anda. Jika Anda tidak mengerti apa pun memposting komentar dan saya akan coba lagi.

BKSpurgeon
sumber
4
Contoh yang luar biasa! Terima kasih.
Iman Sedighi
1
Analogi yang sangat menarik. Terima kasih.
thanhtang
1
@TTT karena (1) setiap kali Anda memiliki penasihat baru maka Anda harus mengubah kelas presiden - Anda tidak ingin membuat perubahan x2. hanya satu. (2) kedua, jika Anda harus mengubah penasihat yang ada, maka Anda mungkin harus kembali dan mengubah salah satu dari tiga panggilan di kelas presiden - Anda hanya benar-benar ingin melakukan satu perubahan, bukan dua. (3) jika Anda memiliki tiga panggilan terpisah maka Anda harus bertanya, dalam kelas presiden: if healthAdvisor? then do this:dan if petraus then do that etc.pola ini perlu diulang dan itu tidak perlu dan rumit. lihat hasil edit di atas.
BKSpurgeon
1
@TTT ya Anda benar. tetapi saya harus perlahan-lahan memperkenalkan konsep kepada pembaca kalau tidak mereka tidak akan mengerti. saya telah menambahkan perubahan lebih lanjut. mohon saran jika diperlukan klarifikasi
BKSpurgeon
1
@TTT kelas dasar vs antarmuka adalah keputusan yang harus dibuat oleh programmer ketika melakukan polymorpism. lihat di sini untuk perincian lebih lanjut: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon
24

Polimorfisme adalah kemampuan untuk memperlakukan kelas objek seolah-olah itu adalah kelas induknya.

Sebagai contoh, anggaplah ada kelas yang disebut Hewan, dan kelas yang disebut Anjing yang mewarisi dari Hewan. Polimorfisme adalah kemampuan untuk memperlakukan objek Anjing apa pun sebagai objek Hewan seperti:

Dog* dog = new Dog;
Animal* animal = dog;
Tom Dalling
sumber
Saya bertanya-tanya bagaimana ini terkait dengan penjelasan (populer) yang diberikan oleh @Ajay Patelclasses have different functionality while sharing a common interface
BornToCode
1
@BornToCode Kelas induk adalah / menyediakan antarmuka umum.
grokmann
1
Polimorfisme tidak membutuhkan subtyping.
Shaun Luttin
22

Polimorfisme:

Ini adalah konsep pemrograman berorientasi objek. Kemampuan objek yang berbeda untuk merespons, masing-masing dengan caranya sendiri, untuk pesan yang identik disebut polimorfisme.

Polimorfisme dihasilkan dari fakta bahwa setiap kelas hidup dalam ruang namanya sendiri. Nama-nama yang diberikan dalam definisi kelas tidak bertentangan dengan nama-nama yang ditetapkan di luarnya. Ini benar, kedua variabel instan dalam struktur data objek dan metode objek:

  • Sama seperti bidang struktur C berada dalam namespace yang dilindungi, demikian juga variabel instance objek.

  • Nama metode juga dilindungi. Berbeda dengan nama fungsi C, nama metode bukan simbol global. Nama metode dalam satu kelas tidak dapat bertentangan dengan nama metode di kelas lain; dua kelas yang sangat berbeda dapat mengimplementasikan metode yang dinamai identik.

Nama metode adalah bagian dari antarmuka objek. Ketika sebuah pesan dikirim meminta suatu objek melakukan sesuatu, pesan itu menyebutkan metode yang harus dilakukan objek tersebut. Karena objek yang berbeda dapat memiliki metode dengan nama yang sama, makna pesan harus dipahami relatif terhadap objek tertentu yang menerima pesan. Pesan yang sama dikirim ke dua objek yang berbeda dapat memanggil dua metode berbeda.

Manfaat utama polimorfisme adalah menyederhanakan antarmuka pemrograman. Ini memungkinkan konvensi untuk didirikan yang dapat digunakan kembali di kelas setelah kelas. Alih-alih menciptakan nama baru untuk setiap fungsi baru yang Anda tambahkan ke program, nama yang sama dapat digunakan kembali. Antarmuka pemrograman dapat digambarkan sebagai seperangkat perilaku abstrak, terlepas dari kelas yang mengimplementasikannya.

Contoh:

Contoh-1: Berikut ini adalah contoh sederhana yang ditulis dalam Python 2.x .

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Contoh-2: Polimorfisme diimplementasikan di Jawa menggunakan metode overloading dan metode overriding konsep.

Mari kita Pertimbangkan contoh Mobil untuk membahas polimorfisme. Ambil merek apa pun seperti Ford, Honda, Toyota, BMW, Benz dll. Semuanya bertipe Mobil.

Tetapi masing-masing memiliki fitur canggih dan teknologi canggih yang terlibat dalam perilaku perpindahan mereka.

Sekarang mari kita buat tipe dasar Mobil

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Mari kita terapkan contoh Ford Car.

Ford memperluas tipe Mobilnya untuk mewarisi semua anggotanya (properti dan metode).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

Kelas Ford di atas memperluas kelas Car dan juga mengimplementasikan metode move (). Meskipun metode perpindahan sudah tersedia untuk Ford melalui Inheritance, Ford masih menerapkan metode dengan caranya sendiri. Ini disebut metode overriding.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Sama seperti Ford, Honda juga memperluas tipe Mobil dan menerapkan metode perpindahan dengan caranya sendiri.

Metode override adalah fitur penting untuk mengaktifkan Polimorfisme. Menggunakan Metode menimpa, Sub jenis dapat mengubah cara kerja metode yang tersedia melalui warisan.

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Keluaran Contoh Polimorfisme:

Dalam metode utama kelas PolymorphismExample, saya telah membuat tiga objek - Mobil, Ford dan Honda. Ketiga objek tersebut disebut oleh tipe Mobil.

Harap perhatikan poin penting di sini bahwa tipe super class dapat merujuk ke objek tipe Sub class tetapi sebaliknya tidak mungkin. Alasannya adalah bahwa semua anggota kelas super tersedia untuk subclass menggunakan warisan dan selama waktu kompilasi, kompiler mencoba untuk mengevaluasi apakah tipe referensi yang kami gunakan memiliki metode yang ia coba akses.

Jadi, untuk mobil referensi, f dan h dalam Contoh Polimorfisme, metode perpindahan ada dari tipe Mobil. Jadi, kompiler melewati proses kompilasi tanpa masalah.

Tetapi ketika datang ke eksekusi run time, mesin virtual memanggil metode pada objek yang merupakan sub tipe. Jadi, metode move () dipanggil dari implementasinya masing-masing.

Jadi, semua objek adalah tipe Mobil, tetapi selama waktu berjalan, eksekusi tergantung pada Obyek di mana doa terjadi. Ini disebut polimorfisme.

Tony Stark
sumber
Konsep overloading tidak ada hubungannya dengan pewarisan dan Polimorfisme.
srk
@srk Metode overloading adalah salah satu cara menerapkan polimorfisme. Ini sering dikategorikan sebagai polimorfisme statis atau ad hoc. wiki.c2.com/?CategoryPolymorphism
Shaun Luttin
12

Biasanya ini merujuk kemampuan suatu objek tipe A untuk berperilaku seperti objek tipe B. Dalam pemrograman berorientasi objek ini biasanya dicapai dengan warisan. Beberapa tautan wikipedia untuk membaca lebih lanjut:

EDIT: memperbaiki tautan yang terputus.

JesperE
sumber
10
"kemampuan untuk objek tipe A untuk berperilaku seperti objek tipe B" - itu bukan definisi yang akurat. Saya akan mengatakan itu lebih seperti kemampuan untuk mengobati sebuah objek dari tipe A seperti ini merupakan objek dari tipe B.
Artem Barger
Iya. Mungkin itu ungkapan yang lebih baik.
JesperE
Untuk kelengkapan, banyak bahasa menerapkan polimorfisme melalui pengetikan bebek, misalnya Python.
ilya n.
Saya bertanya-tanya bagaimana ini terkait dengan penjelasan (populer) yang diberikan oleh @Ajay Patelclasses have different functionality while sharing a common interface
BornToCode
9

Polimorfisme adalah ini:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

Anda dapat melewati hanya Piala alih-alih contoh tertentu. Ini membantu secara umum karena Anda tidak harus memberikan contoh ukuran tertentu () per setiap jenis cangkir

Vinko Vrsalovic
sumber
2
Ini adalah polimorfisme subtipe khusus.
Shaun Luttin
@ vinko-vrsalovic: seperti apa pengembangan perangkat lunak di pedesaan Amerika?
TTT
8

Saya tahu ini adalah pertanyaan lama dengan banyak jawaban bagus tapi saya ingin memasukkan satu kalimat jawaban:

Memperlakukan tipe turunan seolah-olah itu tipe dasar.

Ada banyak contoh di atas yang menunjukkan ini dalam tindakan, tetapi saya merasa ini adalah jawaban singkat yang bagus.

Abe Miessler
sumber
2
Ini subtyping, yang hanya satu jenis polimorfisme.
Shaun Luttin
@ SamunLuttin dapatkah Anda mengarahkan saya ke sumber daya apa pun untuk mempelajari lebih lanjut tentang jenis polimorfisme lainnya?
Abe Miessler
Adalah "polimorfisme ad hoc" dan "polimorfisme parameterik" selain "polimorfisme subtipe".
Shaun Luttin
8

(Saya sedang menelusuri artikel lain tentang sesuatu yang sama sekali berbeda .. dan polimorfisme muncul ... Sekarang saya berpikir bahwa saya tahu apa itu Polimorfisme .... tetapi tampaknya tidak dengan cara yang indah ini dijelaskan .. Ingin menuliskannya di suatu tempat .. lebih baik masih akan membagikannya ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

baca terus dari bagian ini:

..... polimorfisme. Itu cara yang aneh mengatakan bahwa kata benda yang berbeda dapat memiliki kata kerja yang sama diterapkan pada mereka.

Kcats Wolfrevo
sumber
5

Secara umum, ini adalah kemampuan untuk antarmuka sejumlah jenis objek yang berbeda menggunakan API yang sama atau serupa secara dangkal. Ada berbagai bentuk:

  • Function overloading: mendefinisikan beberapa fungsi dengan nama yang sama dan tipe parameter yang berbeda, seperti sqrt (float), sqrt (double) dan sqrt (complex). Dalam sebagian besar bahasa yang memungkinkan ini, kompiler akan secara otomatis memilih yang benar untuk jenis argumen yang diteruskan ke dalamnya, sehingga ini adalah polimorfisme waktu kompilasi.

  • Metode virtual dalam OOP: metode kelas dapat memiliki berbagai implementasi yang disesuaikan dengan spesifikasi subkelasnya; masing-masing dikatakan menimpa implementasi yang diberikan dalam kelas dasar. Diberikan objek yang mungkin dari kelas dasar atau salah satu dari subkelasnya, implementasi yang benar dipilih dengan cepat, sehingga ini adalah polimorfisme run-time.

  • Template: fitur dari beberapa bahasa OO di mana fungsi, kelas, dll. Dapat diparameterisasi berdasarkan tipe. Misalnya, Anda dapat menentukan kelas templat "daftar" umum, dan kemudian instantiate sebagai "daftar bilangan bulat", "daftar string", bahkan mungkin "daftar daftar string" atau sejenisnya. Secara umum, Anda menulis kode sekali untuk struktur data dari jenis elemen sewenang-wenang, dan kompilator menghasilkan versi untuk berbagai jenis elemen.

Stewart
sumber
4

Istilah polimorfisme berasal dari:

poli = banyak

morfisme = kemampuan untuk berubah

Dalam pemrograman, polimorfisme adalah "teknik" yang memungkinkan Anda "memandang" suatu objek sebagai lebih dari satu jenis benda. Contohnya:

Objek siswa juga merupakan objek orang. Jika Anda "melihat" (yaitu pemeran) pada siswa, Anda mungkin dapat meminta ID siswa. Anda tidak bisa selalu melakukan itu dengan seseorang, bukan? (seseorang belum tentu siswa, sehingga mungkin tidak memiliki ID siswa). Namun, seseorang mungkin memiliki nama. Seorang siswa juga.

Intinya, "melihat" objek yang sama dari "sudut" yang berbeda dapat memberi Anda "perspektif" yang berbeda (yaitu sifat atau metode yang berbeda)

Jadi teknik ini memungkinkan Anda membangun hal-hal yang dapat "dilihat" dari sudut yang berbeda.

Mengapa kita menggunakan polimorfisme? Sebagai permulaan ... abstraksi. Pada titik ini sudah cukup info :)

tzup
sumber
3

Mari kita gunakan analogi. Untuk naskah musik yang diberikan setiap musisi yang memainkannya memberikan sentuhannya sendiri dalam interpretasi.

Musisi dapat diabstraksi dengan antarmuka, genre yang dimiliki musisi dapat menjadi kelas abstrak yang mendefinisikan beberapa aturan interpretasi global dan setiap musisi yang bermain dapat dimodelkan dengan kelas konkret.

Jika Anda adalah pendengar karya musik, Anda memiliki referensi ke skrip misalnya Bach 'Fuga and Tocata' dan setiap musisi yang melakukannya melakukannya secara polimorfis dengan caranya sendiri.

Ini hanya contoh dari kemungkinan desain (di Jawa):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}
Boris Pavlovic
sumber
1
AnnHallowaydan VictorBorgamerasa seperti itu harus menjadi objek daripada kelas - contoh Anda akan lebih baik dibaca dengan misalnya. public class Pianist implements Musiciandan victorBorge = new Pianist();lain
Przemek D
3

Saya telah memberikan ikhtisar polimorfisme tingkat tinggi untuk pertanyaan lain:

Polimorfisme dalam c ++

Semoga ini bisa membantu. Ekstrak ...

... membantu memulai dari tes sederhana untuknya dan definisi [polimorfisme]. Pertimbangkan kodenya:

Type1 x;
Type2 y;

f(x);
f(y);

Di sini, f()adalah untuk melakukan beberapa operasi dan diberi nilai xdan ysebagai input. Untuk menjadi polimorfik, f()harus dapat beroperasi dengan nilai setidaknya dua jenis yang berbeda (misalnya intdan double), menemukan dan mengeksekusi kode yang sesuai jenis.

(lanjutan di Polimorfisme dalam c ++ )

Tony Delroy
sumber
3

Polimorfisme adalah kemampuan objek yang dapat diambil dalam berbagai bentuk. Misalnya di kelas manusia, seorang pria dapat bertindak dalam berbagai bentuk ketika kita berbicara tentang hubungan. EX: Seorang lelaki adalah ayah bagi putranya dan ia adalah suami bagi istrinya dan ia adalah guru bagi murid-muridnya.

Rohit
sumber
3

Polimorfisme adalah kemampuan suatu benda untuk mengambil banyak bentuk. Penggunaan polimorfisme yang paling umum dalam OOP terjadi ketika referensi kelas induk digunakan untuk merujuk ke objek kelas anak. Dalam contoh ini yang ditulis di Jawa, kami memiliki tiga jenis kendaraan. Kami membuat tiga objek berbeda dan mencoba menjalankan metode roda mereka:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Hasilnya adalah:

Hasil

Untuk informasi lebih lanjut silakan kunjungi https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Saya harap ini membantu.

Mohammad
sumber
Ya, tetapi Anda tidak menjelaskan apa manfaat polimorfisme. Jelas ada kode yang lebih pendek, di mana Anda akan menghapus kelas Vehicle, dan itu masih akan berfungsi (dengan deklarasi objek yang berbeda, tentu saja).
Cornelius
Saya tidak menjelaskan, karena orang yang mengajukan pertanyaan tidak bertanya tentang manfaatnya. Dia bertanya: "Apa itu polimorfisme, untuk apa itu, dan bagaimana ia digunakan?". Tentang kode, jika Anda dapat melakukannya dengan lebih baik, silakan kirim jawaban Anda. Jadi, komunitas kami dapat menggunakannya. Terima kasih atas komentar Anda.
Mohammad
Maaf, tidak ingin terdengar kasar, yang lain tidak menjelaskan juga. Paling tidak Anda repot mengetikkan kode. Ngomong-ngomong, dia bertanya untuk apa, tapi tidak ada contoh di halaman ini yang menjelaskan untuk apa. Anda semua baru saja menyajikan cara yang kompleks untuk mendapatkan hasil yang sama seperti ini: s28.postimg.org/jq8vl6031/Poly.jpg dan tidak ada yang peduli untuk menjelaskan mengapa seseorang ingin menggunakan polimorfisme, apa untungnya atau tujuannya, apa yang bisa tidak telah dilakukan jika tidak digunakan? Yang saya lihat di halaman ini adalah tawaran naik ke apartemen Anda menggunakan tangga, dan bukan lift ..
Cornelius
.. Tanpa memperhatikan bahwa orang membawa tiang bendera yang terlalu besar untuk muat lift. Saya tidak tahu cara memposting kode, jadi saya tidak bisa banyak membantu ...
Cornelius
2

Polimorfisme adalah kemampuan programmer untuk menulis metode dengan nama yang sama yang melakukan hal berbeda untuk berbagai jenis objek, tergantung pada kebutuhan objek tersebut. Sebagai contoh, jika Anda mengembangkan kelas yang dipanggil Fractiondan kelas yang dipanggil ComplexNumber, keduanya mungkin termasuk metode yang disebut display(), tetapi masing-masing dari mereka akan menerapkan metode itu secara berbeda. Dalam PHP, misalnya, Anda dapat menerapkannya seperti ini:

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Output:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Beberapa jawaban lain tampaknya menyiratkan bahwa polimorfisme hanya digunakan dalam hubungannya dengan warisan; misalnya, mungkin Fractiondan ComplexNumberkeduanya mengimplementasikan kelas abstrak yang disebut Numberyang memiliki metode display(), yang mana Fraction dan ComplexNumber keduanya wajib untuk mengimplementasikan. Tetapi Anda tidak perlu warisan untuk mengambil keuntungan dari polimorfisme.

Setidaknya dalam bahasa yang diketik secara dinamis seperti PHP (saya tidak tahu tentang C ++ atau Java), polimorfisme memungkinkan pengembang untuk memanggil metode tanpa harus mengetahui jenis objek sebelumnya, dan percaya bahwa implementasi metode yang benar akan disebut. Sebagai contoh, katakanlah pengguna memilih jenis yang Numberdibuat:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

Dalam hal ini, display()metode yang sesuai akan dipanggil, meskipun pengembang tidak dapat mengetahui sebelumnya apakah pengguna akan memilih fraksi atau bilangan kompleks.

Alex Basson
sumber
2
Itu bukan polimorfisme. Itu dua kelas yang memiliki metode dengan nama yang sama. Mereka perlu dihubungkan oleh kelas dasar atau antarmuka yang disebut "dapat ditampilkan" atau sesuatu yang serupa, dan kemudian metode lain hanya akan peduli bahwa objek bertipe "dapat ditampilkan" daripada Kompleks atau Fraksi.
Pod
Saya selalu berpikir polimorfisme adalah "dua kelas yang memiliki metode yang sama." Faktanya, mengutip Stephan Kochan (dari siapa saya tidak tahu malu merobek contoh Fraksi / Kompleks ini), "kemampuan untuk berbagi nama metode yang sama di berbagai kelas dikenal sebagai polimorfisme." (dari Programming_In_Objective-C ) Dia tidak menyebutkan perlunya menghubungkan kelas melalui kelas dasar. Mungkin berbeda dalam bahasa yang berbeda, jujur ​​saya tidak tahu.
Alex Basson
Bahkan kerasnya pembelaan ini dikutip dari buku yang diterbitkan, saya masih berpendapat bahwa itu salah. Terutama karena tampaknya bertentangan dengan satu sama lain, bahasa agnostik pembelaan polimorfisme. Dan sementara hasil akhirnya sama seperti yang terlihat dengan polimorfisme, saya berpendapat bahwa alih-alih pengetikan dinamis yang memungkinkan pemrogram dapat mendorong bahwa implementasi metode yang benar di antara yang lain, metode bernama similary sedang dipanggil.
vipirtti
2

Dalam pemrograman berorientasi objek, polimorfisme mengacu pada kemampuan bahasa pemrograman untuk memproses objek secara berbeda tergantung pada tipe data atau kelas mereka . Lebih khusus lagi, ini adalah kemampuan untuk mendefinisikan kembali metode untuk kelas turunan.

sjith
sumber
2

Polimorfisme secara harfiah berarti, berbagai bentuk. (atau banyak bentuk): Objek dari kelas yang berbeda dan metode nama yang sama, tetapi alur kerja berbeda. Contoh sederhana adalah:

Pertimbangkan seseorang X.

Dia hanya satu orang tetapi dia bertindak banyak. Anda mungkin bertanya bagaimana:

Dia adalah putra bagi ibunya. Seorang teman bagi teman-temannya. Seorang saudara lelaki dari saudara perempuannya.

Shourob Datta
sumber
2

Polimorfisme dalam OOP berarti suatu kelas dapat memiliki tipe yang berbeda, pewarisan adalah salah satu cara menerapkan polimorfisme.

misalnya, Shape adalah antarmuka, memiliki subtipe Square , Circle , Diamond . sekarang Anda memiliki objek Square, Anda dapat meng-upcasting Square to Shape secara otomatis, karena Square adalah Shape. Tetapi ketika Anda mencoba untuk menurunkan Shape ke Square, Anda harus melakukan casting tipe eksplisit, karena Anda tidak bisa mengatakan Shape is Square, itu bisa juga Circle. jadi Anda perlu secara manual melemparkannya dengan kode seperti Square s = (Square)shape, bagaimana jika bentuknya Circle, Anda akan dapatkan java.lang.ClassCastException, karena Circle bukan Square.

Frank Zhang
sumber
2

Polimorfisme:

Eksekusi yang berbeda sesuai dengan instance kelas, bukan jenis variabel referensi.

Variabel referensi tipe antarmuka dapat merujuk ke salah satu instance kelas yang mengimplementasikan antarmuka itu.

Hassan Tareq
sumber
1

Polimorfisme adalah kemampuan untuk menggunakan objek dalam kelas yang diberikan, di mana semua komponen yang membentuk objek diwarisi oleh subkelas dari kelas yang diberikan. Ini berarti bahwa sekali objek ini dideklarasikan oleh kelas, semua subclass di bawahnya (dan subclass mereka, dan seterusnya sampai Anda mencapai subclass terjauh / terendah) mewarisi objek dan komponennya (makeup).

Ingatlah bahwa setiap kelas harus disimpan dalam file yang terpisah.

Kode berikut mencontohkan Polimorfisme:

SuperClass:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Sang ayah, subkelas:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Anak itu, subclass lain:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Metode eksekusi, referensi kelas Induk untuk memulai:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

Perhatikan bahwa setiap kelas harus dideklarasikan dalam file * .java yang terpisah. Kode harus dikompilasi. Juga perhatikan bahwa Anda dapat terus menggunakan maidenName dan familyTree lebih jauh ke bawah. Itulah konsep polimorfisme. Konsep pewarisan juga dieksplorasi di sini, di mana satu kelas dapat digunakan atau didefinisikan lebih lanjut oleh subkelas.

Semoga ini bisa membantu dan membuatnya jelas. Saya akan memposting hasil ketika saya menemukan komputer yang dapat saya gunakan untuk memverifikasi kode. Terima kasih atas kesabarannya!

Midimistro
sumber
2
Perhatikan bahwa setiap anak bukan orang tua sehingga struktur ini salah. Kelas atas harus Child (jika Anda tidak hanya memulai dengan "Person") yang akan selalu benar kecuali untuk Adam. Anda dapat mengatur parent_id-nya menjadi nol karena Pencipta tidak dapat didefinisikan dengan konstruk kecerdasan manusia apa pun.
Yehosef
1

Polimorfisme memungkinkan rutin yang sama (fungsi, metode) untuk bertindak pada tipe yang berbeda.

Karena banyak jawaban yang ada menggabungkan subtyping dengan polimorfisme, berikut adalah tiga cara (termasuk subtyping) untuk mengimplementasikan polimorfisme.

  • Polimorfisme parameter (generik) memungkinkan rutin untuk menerima satu atau lebih tipe parameter, selain parameter normal, dan berjalan sendiri pada tipe tersebut.
  • Subtipe polimorfisme memungkinkan rutin untuk bertindak pada subtipe apa pun dari parameternya.
  • Polimorfisme ad hoc umumnya menggunakan kelebihan beban rutin untuk memberikan perilaku polimorfik, tetapi juga dapat merujuk pada implementasi polimorfisme lainnya.

Lihat juga:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

Shaun Luttin
sumber
0

Dalam bahasa Berorientasi Objek, polimorfisme memungkinkan perawatan dan penanganan berbagai tipe data melalui antarmuka yang sama. Sebagai contoh, pertimbangkan pewarisan dalam C ++: Kelas B berasal dari Kelas A. Sebuah penunjuk tipe A * (penunjuk ke kelas A) dapat digunakan untuk menangani kedua objek dari kelas A DAN objek dari kelas B.

Perilaku Eran
sumber
0

Polimorfisme dalam istilah pengkodean adalah ketika objek Anda dapat eksis sebagai beberapa tipe melalui pewarisan, dll. Jika Anda membuat kelas bernama "Shape" yang mendefinisikan jumlah sisi yang dimiliki objek Anda, maka Anda dapat membuat kelas baru yang mewarisinya seperti "Square" ". Ketika Anda kemudian membuat contoh dari "Kotak" Anda kemudian dapat melemparkannya kembali dan maju dari "Bentuk" ke "Kotak" seperti yang diperlukan.

Brian Scott
sumber
0

Polimorfisme memberi Anda kemampuan untuk membuat satu modul memanggil modul lain, namun memiliki titik ketergantungan waktu kompilasi terhadap aliran kontrol alih-alih dengan aliran kontrol.

Dengan menggunakan polimorfisme, modul tingkat tinggi tidak tergantung pada modul tingkat rendah. Keduanya bergantung pada abstraksi. Ini membantu kami menerapkan prinsip inversi ketergantungan ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).

Di sinilah saya menemukan definisi di atas. Sekitar 50 menit dalam video, instruktur menjelaskan hal di atas. https://www.youtube.com/watch?v=TMuno5RZNeE

Raghav Navada
sumber
0

Apa itu polimorfisme?

Polimorfisme adalah kemampuan untuk:

  • Meminta operasi pada contoh dari jenis khusus dengan hanya mengetahui jenis umum sementara memanggil metode jenis khusus dan bukan dari jenis umum: itu adalah polimorfisme dinamis .

  • Tetapkan beberapa metode yang memiliki nama save tetapi memiliki parameter differents: itu adalah polimorfisme statis .

Yang pertama kalau definisi sejarah dan yang paling penting.

Untuk apa polimorfisme digunakan?

Hal ini memungkinkan untuk membuat konsistensi yang sangat diketik dari hirarki kelas dan untuk melakukan beberapa hal ajaib seperti mengelola daftar objek dari tipe yang berbeda tanpa mengetahui tipenya tetapi hanya satu dari tipe induknya, serta binding data.

Mengetik kuat dan lemah

Sampel

Berikut adalah beberapa Bentuk seperti Titik, Garis, Persegi Panjang dan Lingkaran yang memiliki operasi Draw () tidak mengambil apa-apa atau parameter untuk mengatur batas waktu untuk menghapusnya.

public class Shape
{
 public virtual void Draw()
 {
   DoNothing();
 }
 public virtual void Draw(int timeout)
 {
   DoNothing();
 }
}

public class Point : Shape
{
 int X, Y;
 public override void Draw()
 {
   DrawThePoint();
 }
}

public class Line : Point
{
 int Xend, Yend;
 public override Draw()
 {
   DrawTheLine();
 }
}

public class Rectangle : Line
{
 public override Draw()
 {
   DrawTheRectangle();
 }
}

var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };

foreach ( var shape in shapes )
  shape.Draw();

Di sini kelas Shape dan Shape.Draw () metode harus ditandai sebagai abstrak.

Mereka bukan untuk membuat mengerti.

Penjelasan

Tanpa polimorfisme, menggunakan abstrak-virtual-menimpa, sambil menguraikan bentuk, itu hanya metode Spahe.Draw () yang disebut sebagai CLR tidak tahu metode apa yang harus dipanggil. Jadi itu memanggil metode dari jenis yang kita gunakan, dan di sini jenisnya adalah Shape karena daftar deklarasi. Jadi kodenya tidak melakukan apa-apa sama sekali.

Dengan polimorfisme, CLR mampu menyimpulkan jenis objek yang sebenarnya yang kita gunakan menggunakan apa yang disebut tabel virtual. Jadi itu disebut yang baik metode yang , dan di sini memanggil Shape.Draw () jika Shape is Point memanggil Point.Draw (). Jadi kodenya menggambar bentuk.

Lebih banyak bacaan

C # - Polimorfisme (Level 1)

Polimorfisme di Jawa (Level 2)

Polimorfisme (Panduan Pemrograman C #)

Tabel metode virtual

Olivier Rogier
sumber