Apa itu polimorfisme, untuk apa itu, dan bagaimana ia digunakan?
Apa itu polimorfisme, untuk apa itu, dan bagaimana ia digunakan?
Jawaban:
Jika Anda berpikir tentang akar kata Yunani, itu harus menjadi jelas.
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 BigDecimal
atau Rational
atau Imaginary
juga dapat menyediakan operasi tersebut, meskipun mereka beroperasi pada tipe data yang berbeda.
Contoh klasik adalah Shape
kelas 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 p
meskipun, sekarang saya harus menjelaskan leluconnya, bahkan itu juga tidak lucu.
Terkadang, Anda harus berhenti saat Anda berada di belakang :-)
Poly = many and Morph = change or form
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.
Class_Excel
, Class_CSV
dipanggil, atau Reader
dipanggil kelas. Either way, semacam iteratif jika / then / else harus disimpan di suatu tempat.
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.
Jika ada yang mengatakan CUT kepada orang-orang ini
Apa yang akan terjadi?
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.
.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.
Presiden Amerika Serikat menggunakan polimorfisme. Bagaimana? Yah, dia punya banyak penasihat:
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.
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 IAdvisor
antarmuka 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);
}
}
Yang perlu Anda ketahui hanyalah ini:
Saya sangat berharap ini membantu Anda. Jika Anda tidak mengerti apa pun memposting komentar dan saya akan coba lagi.
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.
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;
classes have different functionality while sharing a common interface
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.
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.
classes have different functionality while sharing a common interface
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
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.
(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.
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.
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 :)
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());
}
AnnHalloway
dan VictorBorga
merasa seperti itu harus menjadi objek daripada kelas - contoh Anda akan lebih baik dibaca dengan misalnya. public class Pianist implements Musician
dan victorBorge = new Pianist();
lain
Saya telah memberikan ikhtisar polimorfisme tingkat tinggi untuk pertanyaan lain:
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 nilaix
dany
sebagai input. Untuk menjadi polimorfik,f()
harus dapat beroperasi dengan nilai setidaknya dua jenis yang berbeda (misalnyaint
dandouble
), menemukan dan mengeksekusi kode yang sesuai jenis.
(lanjutan di Polimorfisme dalam c ++ )
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.
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:
Untuk informasi lebih lanjut silakan kunjungi https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Saya harap ini membantu.
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 Fraction
dan 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 Fraction
dan ComplexNumber
keduanya mengimplementasikan kelas abstrak yang disebut Number
yang 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 Number
dibuat:
$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.
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.
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.
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.
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!
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.
Lihat juga:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
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.
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.
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
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.
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.
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.
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.
Polimorfisme di Jawa (Level 2)