Polimorfizm nedir, ne işe yarar ve nasıl kullanılır?
Polimorfizm nedir, ne işe yarar ve nasıl kullanılır?
Yanıtlar:
Terimin Yunan kökenleri hakkında düşünürseniz, bu belirginleşmelidir.
Dolayısıyla, polimorfizm, farklı altta yatan formlar (veri türleri) için aynı arayüzü sunma yeteneğidir (programlamada).
Örneğin, birçok dilde, tamsayılar ve kayan noktalar dolaylı olarak polimorfiktir, çünkü türlerin farklı olmasına bakılmaksızın toplama, çıkarma, çarpma vb. Nadiren nadiren nesne olarak kabul edilirler.
Ama aynı şekilde, böyle bir sınıf BigDecimal
veya Rational
ya Imaginary
da farklı veri türleri üzerinde işlem olsa da, bu işlemleri sağlayabilir.
Klasik örnek, Shape
sınıf ve ondan miras alabilen tüm sınıflardır (kare, daire, dodecahedron, düzensiz poligon, uyarma vb.).
Polimorfizm ile, bu sınıfların her birinin altta yatan farklı verileri olacaktır. Bir nokta şekli sadece iki koordinat gerektirir (elbette iki boyutlu bir alanda olduğu varsayılır). Bir dairenin bir merkeze ve yarıçapa ihtiyacı vardır. Bir kare veya dikdörtgen, sol üst ve sağ alt köşeler için iki koordinat ve (muhtemelen) bir döndürme gerektirir. Düzensiz bir çokgenin bir dizi çizgiye ihtiyacı vardır.
Sınıfı hem kodundan hem de verilerinden sorumlu tutarak, polimorfizm elde edebilirsiniz. Bu örnekte, her sınıfın kendi Draw()
işlevi vardır ve istemci kodu şunları yapabilir:
shape.Draw()
herhangi bir şekil için doğru davranışı elde etmek.
Bu kod verilerden ayrı olduğu şeyler yapmanın eski yolu aksine olduğunu ve gibi işlevleri olurdu drawSquare()
ve drawCircle()
.
Nesne yönelimi, polimorfizm ve kalıtım, yakından ilişkili kavramlardır ve bilmek hayati önem taşır. Uzun kariyerim boyunca temelde sadece fışkıran birçok "gümüş mermi" oldu, ancak OO paradigması iyi bir şey oldu. Öğrenin, anlayın, sevin - yaptığınızdan memnun olacaksınız :-)
(a) Aslında bunu bir şaka olarak yazdım ama doğru olduğu ve bu nedenle o kadar komik olmadığı ortaya çıktı. Monomer stiren karbon ve hidrojenden yapılır ve polistiren bunun gruplarından yapılır .C8H8
(C8H8)n
Belki de bir polipin mektubun birçok örneği olduğunu söylemeliydim, p
ancak şimdi şakayı açıklamak zorunda kaldım, hatta bu da komik görünmüyor.
Bazen, geride kalırken bırakmalısın :-)
Poly = many and Morph = change or form
Polimorfizm, bir nesneye bir şeyin genel bir versiyonu olarak bakabileceğiniz zamandır, ancak ona eriştiğinizde, kod tam olarak hangi tür olduğunu belirler ve ilişkili kodu çağırır.
İşte C # 'da bir örnek. Bir konsol uygulamasında dört sınıf oluşturun:
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;
}
}
Şimdi konsol uygulaması için modülün Main () öğesinde aşağıdakileri oluşturun:
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));
}
}
Bu örnekte, her bir alt sınıfının kaç tane tekerleği olduğunu bilmeyen, ancak her bir alt sınıfın kaç tane tekerleğe sahip olduğunu bilmekle sorumlu olduğunu bilen Vehicle temel sınıfının bir listesini oluşturuyoruz.
Daha sonra listeye bir Bisiklet, Araba ve Kamyon ekliyoruz.
Daha sonra, listedeki her bir Araç arasında döngü yapabilir ve hepsine aynı şekilde davranabiliriz, ancak her Araç 'Tekerlekler' özelliğine eriştiğimizde, Araç sınıfı bu kodun yürütülmesini ilgili alt sınıfa devreder.
Bu kodun polimorfik olduğu söylenir, çünkü tam olarak yürütülen kod çalışma zamanında referans gösterilen alt sınıf tarafından belirlenir.
Umarım bunun sana yardımı olur.
Class_Excel
, Class_CSV
bir çağrılacak ya sahip Reader
adlandırılan sınıfı. Her iki durumda da, / then / else bir yerde saklanacaksa, bir tür yinelemeli.
Gönderen anlamak ve PHP Polimorfizmi uygulanması , teşekkürler Steve Guidetti.
Çok biçimlilik çok basit bir kavram için uzun bir kelimedir.
Polimorfizm, ortak bir arabirimi paylaşırken sınıfların farklı işlevlere sahip olduğu nesne yönelimli programlamada bir deseni tanımlar.
Polimorfizmin güzelliği, farklı sınıflarla çalışan kodun, aynı şekilde kullanıldığı için hangi sınıfı kullandığını bilmesine gerek olmamasıdır. Çok biçimlilik için gerçek bir dünya benzetmesi bir düğmedir. Herkes bir düğmeyi nasıl kullanacağını bilir: basitçe ona baskı uygularsınız. Bununla birlikte, bir düğmenin “yaptığı” ne bağlı olduğuna ve içinde kullanıldığı bağlama bağlıdır - ancak sonuç, nasıl kullanılacağını etkilemez. Patronunuz size bir düğmeye basmanızı söylüyorsa, görevi gerçekleştirmek için gereken tüm bilgilere zaten sahipsiniz.
Programlama dünyasında, polimorfizm uygulamaları daha modüler ve genişletilebilir hale getirmek için kullanılır. Farklı eylem yollarını tanımlayan dağınık koşullu ifadeler yerine, ihtiyaçlarınıza göre seçtiğiniz değiştirilebilir nesneler yaratırsınız. Polimorfizmin temel amacı budur.
Birisi bu insanlara CUT diyorsa
Ne olacak?
Dolayısıyla yukarıdaki gösterim OOP'de polimorfizm nedir (aynı isim, farklı davranış).
Bir röportaj yapacaksanız ve görüşmeci oturduğumuz aynı odada polimorfizm için canlı bir örnek söylemenizi / göstermenizi istiyorsa,
Yanıt - Kapı / Pencereler
Nasıl mı merak ediyorsunuz?
Kapı / Pencere ile - bir kişi gelebilir, hava gelebilir, ışık gelebilir, yağmur gelebilir, vb.
Daha iyi ve basit bir şekilde anlamak için yukarıdaki örnek kullandım .. Kod için referans gerekiyorsa yukarıdaki cevapları izleyin.
.foo()
yöntemi varsa, o zaman ortak bir arayüzü paylaşmaları gerektiğini düşünebilir . Ancak, bu doğru değildir ve yanlış soyutlamalara yol açar. Bir arabirim , birçok farklı uygulamaya sahip olabilecek, ancak aynı girdi kümesinden çekilecek ve aynı çıktı kümesinden bir şeyler döndürecek bir rol tanımlamalıdır . x.cut(...)
Bir cerrah, stilist veya aktör için bir giriş aynı değildir ve çıktı da değildir.
Amerika Birleşik Devletleri Başkanı polimorfizm kullanıyor. Nasıl? Pek çok danışmanı var:
Herkes sadece bir şeyden sorumlu olmalıdır: Örnek:
Başkan çinko kaplama veya kuantum fiziği konusunda uzman değil. Çok şey bilmiyor - ama tek bir şey biliyor: ülkeyi nasıl idare edecek.
Kodla aynı şey: endişeler ve sorumluluklar ilgili sınıflara / insanlara ayrılmalıdır. Aksi takdirde, cumhurbaşkanının dünyadaki her şeyi - tüm Vikipedi'yi bilmesini sağlayabilirsiniz. Tüm wikipedia'yı kodunuzun bir sınıfında bulunduğunuzu düşünün: bu bir kabus olacaktır.
Bir başkanın tüm bu özel şeyleri bilmesi neden kötü bir fikirdir?
Başkan özellikle insanlara ne yapmaları gerektiğini söyleseydi, başkanın ne yapacağını tam olarak bilmesi gerektiği anlamına gelir . Başkanın belirli şeyleri kendisi bilmesi gerekiyorsa, bu, bir değişiklik yapmanız gerektiğinde, sadece bir yerde değil, iki yerde yapmanız gerektiği anlamına gelir.
Örneğin, EPA kirlilik yasalarını değiştirirse, bu olduğunda: EPA Sınıfında ve ayrıca Başkan sınıfında bir değişiklik yapmanız gerekir . Kodu bir yerine iki yerde değiştirmek tehlikeli olabilir - çünkü bakımı çok daha zordur.
Daha iyi bir yaklaşım var mı?
Daha iyi bir yaklaşım var: başkanın hiçbir şeyin ayrıntılarını bilmesine gerek yok - özellikle bu şeyleri yapmakla görevli insanlardan en iyi tavsiyeyi isteyebilir.
Ülkeyi yönetmek için polimorfik bir yaklaşım kullanabilir.
Bir polimorfik yaklaşım kullanma örneği:
Başkanın yaptığı tek şey insanlardan ona tavsiyelerde bulunmalarını istemektir - ve gerçek hayatta gerçekte yaptığı budur - ve iyi bir başkan bunu yapmak zorundadır. danışmanlarının hepsi farklı tepki veriyor, ama hepsi başkanın ne demek istediğini biliyorlar: Advise (). Yüzlerce insan ofisine akıyor. Aslında kim oldukları önemli değil. Başkanın tüm bildiği, onlardan "Tavsiye" etmelerini istediklerinde, buna göre nasıl karşılık verebileceklerini bildikleri :
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
}
}
Bu yaklaşım, cumhurbaşkanının askeri şeyler, sağlık hizmetleri veya uluslararası diplomasi hakkında hiçbir şey bilmeden ülkeyi tam anlamıyla yönetmesine izin verir: ayrıntılar uzmanlara bırakılır. Başkanın bilmesi gereken tek şey şudur: "Tavsiye ()".
Ne istemezsiniz "T:
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();
}
}
HAYIR! HAYIR! HAYIR! Yukarıdaki senaryoda, başkan tüm işi yapıyor: artan asker sayısını ve önceden var olan koşulları biliyor. Bu, Orta Doğu politikaları değişirse, cumhurbaşkanının Petraeus sınıfının yanı sıra emirlerini de değiştirmek zorunda kalacağı anlamına gelir . Sadece Petraeus sınıfını değiştirmek zorundayız, çünkü Başkan'ın bu tür ayrıntılara girmesi gerekmiyor. Ayrıntıları bilmesine gerek yok. Bilmesi gereken tek şey, eğer bir emir verirse, her şeyin halledileceği. Tüm detaylar uzmanlara bırakılmalıdır.
Bu, cumhurbaşkanının en iyi yaptığı şeyi yapmasına izin verir: genel politika belirle, iyi görün ve golf oyna: P.
Aslında bu kısaca polimorfizmdir. Tam olarak nasıl yapılır? "Ortak bir arabirim uygulamak" veya bir temel sınıf (kalıtım) kullanarak - bunu daha net detaylandıran yukarıdaki yanıtlara bakın. (Bu kavramı daha net bir şekilde anlamak için bir arayüzün ne olduğunu bilmeniz gerekir ve kalıtımın ne olduğunu anlamanız gerekir. Bu olmadan, mücadele edebilirsiniz.)
Başka bir deyişle, Petraeus, Condi ve HealthOfficials tüm "bir arabirim uygulamak" sınıfları olacak - diyelim çağrı bunu IAdvisor
sadece bir yöntemi içeren arabirimi: Advise()
. Ama şimdi ayrıntılara giriyoruz.
Bu ideal olurdu
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);
}
}
Gerçekten bilmeniz gereken şey şudur:
Umarım size yardımcı olur. Eğer bir şey anlamıyorsanız yorum göndermek ve ben tekrar deneyeceğim.
if healthAdvisor? then do this:
ve if petraus then do that etc.
bu örüntünün tekrarlanması gerekecek ve bu gereksiz ve karmaşık. yukarıdaki düzenlemeye bakın.
Polimorfizm, bir nesne sınıfını üst sınıfmış gibi ele alma yeteneğidir.
Örneğin, Hayvan adında bir sınıf ve Hayvan adından miras alan Köpek adında bir sınıf olduğunu varsayalım. Polimorfizm, herhangi bir Köpek nesnesine bir Hayvan nesnesi gibi davranma yeteneğidir:
Dog* dog = new Dog;
Animal* animal = dog;
classes have different functionality while sharing a common interface
Polimorfizm:
Nesneye yönelik programlama kavramıdır.Farklı nesnelerin her biri kendi yollarıyla özdeş mesajlara cevap verme yeteneğine polimorfizm denir.
Çok biçimlilik, her sınıfın kendi ad alanında yaşadığı gerçeğinden kaynaklanmaktadır. Sınıf tanımında atanan adlar, dışında herhangi bir yere atanan adlarla çakışmaz. Bu, bir nesnenin veri yapısındaki örnek değişkenleri ve nesnenin yöntemleri için geçerlidir:
Bir C yapısının alanları korumalı bir ad alanında olduğu gibi, bir nesnenin örnek değişkenleri de öyle.
Yöntem adları da korunur. C işlevlerinin adlarından farklı olarak, yöntem adları genel simgeler değildir. Bir sınıftaki yöntemin adı diğer sınıflardaki yöntem adlarıyla çakışamaz; iki çok farklı sınıf aynı adlı yöntemleri uygulayabilir.
Yöntem adları bir nesnenin arabiriminin parçasıdır. Bir nesnenin bir şey yapmasını isteyen bir mesaj gönderildiğinde, mesaj nesnenin gerçekleştirmesi gereken yöntemi adlandırır. Farklı nesneler aynı ada sahip yöntemlere sahip olabileceğinden, mesajın anlamı, mesajı alan belirli nesneye göre anlaşılmalıdır. İki farklı nesneye gönderilen aynı mesaj iki farklı yöntemi çağırabilir.
Polimorfizmin ana yararı, programlama arayüzünü basitleştirmesidir. Dersten sonra sınıfta yeniden kullanılabilecek sözleşmelerin oluşturulmasına izin verir. Bir programa eklediğiniz her yeni işlev için yeni bir ad icat etmek yerine aynı adlar yeniden kullanılabilir. Programlama arayüzü, onları uygulayan sınıflardan oldukça farklı bir dizi soyut davranış olarak tanımlanabilir.
Örnekler:
Örnek-1: İşte Python 2.x ile yazılmış basit bir örnek .
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()
Örnek-2: Polimorfizm, Java'da yöntem aşırı yüklenmesi ve yöntem geçersiz kılma kavramları kullanılarak uygulanır.
Polimorfizmi tartışmak için Araba örneğini ele alalım. Ford, Honda, Toyota, BMW, Benz vb.Gibi herhangi bir markayı alın, Her şey araba tipidir.
Ancak her birinin kendi gelişmiş özellikleri ve hareket davranışlarında daha ileri teknoloji var.
Şimdi temel tip bir Araba oluşturalım
Car.java
public class Car {
int price;
String name;
String color;
public void move(){
System.out.println("Basic Car move");
}
}
Ford Car örneğini uygulayalım.
Ford, Car türünü tüm üyelerini devralmak üzere genişletir (özellikler ve yöntemler).
Ford.java
public class Ford extends Car{
public void move(){
System.out.println("Moving with V engine");
}
}
Yukarıdaki Ford sınıfı Car sınıfını genişletir ve ayrıca move () yöntemini uygular. Taşıma yöntemi Ford için Devralma yoluyla zaten mevcut olsa da, Ford yöntemi hala kendi yöntemiyle uygulamıştır. Buna yöntem geçersiz kılma denir.
Honda.java
public class Honda extends Car{
public void move(){
System.out.println("Move with i-VTEC engine");
}
}
Tıpkı Ford gibi, Honda da Araba türünü genişletiyor ve hareket yöntemini kendi yöntemiyle uyguluyor.
Metot geçersiz kılma, Polimorfizmi mümkün kılan önemli bir özelliktir. Yöntem geçersiz kılmayı kullanarak, Alt türler, kalıtım yoluyla kullanılabilen yöntemlerin çalışma şeklini değiştirebilir.
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();
}
}
Polimorfizm Örnek Çıktısı:
PolymorphismExample sınıfı ana yöntemde üç nesne yarattım: Araba, Ford ve Honda. Her üç nesne de Araba tipi ile belirtilir.
Burada, bir süper sınıf türünün bir Alt sınıf türüne atıfta bulunabileceğini, ancak tam tersinin mümkün olmadığını unutmayın. Bunun nedeni, süper sınıfın tüm üyelerinin miras kullanarak alt sınıfa erişebilmeleri ve derleme zamanı boyunca, derleyici, kullandığımız referans türünün erişmeye çalıştığı yönteme sahip olup olmadığını değerlendirmeye çalışır.
Bu nedenle, PolymorphismExample öğesindeki car, f ve h referansları için move yöntemi Car tipinde bulunur. Böylece, derleyici derleme işlemini sorunsuz bir şekilde geçirir.
Ancak çalışma zamanı yürütme söz konusu olduğunda, sanal makine alt tip olan nesneler üzerindeki yöntemleri çağırır. Bu nedenle, move () yöntemi ilgili uygulamalarından çağrılır.
Yani, tüm nesneler Car tipindedir, ancak çalışma süresi boyunca yürütme, çağrının gerçekleştiği Nesneye bağlıdır. Buna polimorfizm denir.
Genellikle bu, A tipi bir nesnenin B tipi bir nesne gibi davranma yeteneğini ifade eder. Nesne yönelimli programlamada bu genellikle miras ile elde edilir. Daha fazla okumak için bazı wikipedia bağlantıları:
EDIT: bozuk kopuk bağlantılar.
classes have different functionality while sharing a common interface
Çok biçimlilik şudur:
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
}
belirli bir örnek yerine yalnızca bir Kupa geçirebilirsiniz. Bu genel olarak yardımcı olur, çünkü her fincan türü için belirli bir ölçü () örneği sağlamanız gerekmez
Bunun çok iyi cevapları olan daha eski bir soru olduğunu biliyorum ama bir cümle cevabı eklemek istiyorum:
Türetilmiş bir türe temel tipmiş gibi davranılması.
Yukarıda bunu hareket halinde gösteren çok sayıda örnek var, ancak bunun iyi ve özlü bir cevap olduğunu hissediyorum.
(Ben tamamen farklı bir şey üzerine başka bir makaleye göz atıyordu .. ve polimorfizm ortaya çıktı ... Şimdi ben polimorfizmin ne olduğunu bildiğimi düşündüm .... ama görünüşe göre bu güzel şekilde açıklanmadı .. Bir yere yazmak istedim .. daha iyisi yine paylaşacak ...)
http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife
bu bölümden okuyun:
..... polimorfizm. Bu, farklı isimlerin kendilerine aynı fiili uygulayabileceğini söylemenin geeky bir yoludur.
Genel olarak konuşursak, aynı veya yüzeysel olarak benzer bir API kullanarak bir dizi farklı nesne türünü arayüzleme yeteneğidir. Çeşitli formlar vardır:
Fonksiyon aşırı yükleme: aynı isimde ve sqrt (float), sqrt (double) ve sqrt (karmaşık) gibi farklı parametre türlerine sahip birden fazla fonksiyon tanımlamak. Buna izin veren çoğu dilde, derleyici kendisine aktarılan argüman türü için otomatik olarak doğru olanı seçecektir, bu nedenle bu derleme zamanı polimorfizmidir.
OOP'ta sanal yöntemler: bir sınıfın yöntemi, alt sınıflarının özelliklerine göre uyarlanmış çeşitli uygulamalara sahip olabilir; bunların her birinin temel sınıfta verilen uygulamayı geçersiz kıldığı söylenir. Temel sınıf veya alt sınıflarından herhangi biri olabilen bir nesne göz önüne alındığında, anında doğru uygulama seçilir, bu nedenle bu çalışma zamanı polimorfizmidir.
Şablonlar: bazı OO dillerinin bir fonksiyonun, sınıfın vb. Bir türe göre parametrelenebildiği bir özellik. Örneğin, genel bir "liste" şablon sınıfı tanımlayabilir ve daha sonra "tamsayı listesi", "dize listesi", hatta "dize listelerinin listesi" veya benzeri olarak başlatabilirsiniz. Genellikle, kodu rastgele öğe türünün veri yapısı için bir kez yazarsınız ve derleyici çeşitli eleman türleri için bunun sürümlerini oluşturur.
Polimorfizm terimi:
poli = çok
morfizm = değişme yeteneği
Programlamada, polimorfizm bir nesneye birden fazla şey gibi "bakmanızı" sağlayan bir "teknik" tir. Örneğin:
Öğrenci nesnesi aynı zamanda bir kişi nesnesidir. Öğrenciye "bakarsanız" (yani yayınlarsanız), muhtemelen öğrenci kimliğini isteyebilirsiniz. Bunu her zaman bir insanla yapamazsın, değil mi? (kişi mutlaka öğrenci değildir, bu nedenle öğrenci kimliği olmayabilir). Ancak, bir kişinin muhtemelen bir adı vardır. Bir öğrenci de öyle.
Alt satırda, aynı nesneye farklı "açılardan" "bakmak" size farklı "bakış açıları" verebilir (yani farklı özellikler veya yöntemler)
Böylece bu teknik, farklı açılardan “bakılabilecek” şeyler inşa etmenizi sağlar.
Neden polimorfizm kullanıyoruz? Yeni başlayanlar için ... soyutlama. Bu noktada yeterli bilgi olmalı :)
Bir benzetme kullanalım. Belirli bir müzik senaryosu için çalan her müzisyen, yorumda kendi dokunuşunu verir.
Müzisyen arayüzlerle soyutlanabilir, müzisyenin ait olduğu tür, bazı küresel yorum kurallarını tanımlayan bir soyut sınıf olabilir ve çalan her müzisyen somut bir sınıfla modellenebilir.
Müzikal çalışmanın bir dinleyicisi iseniz, Bach'ın 'Fuga ve Tocata' adlı senaryosuna ve bunu yapan her müzisyene kendi tarzında polimorfiklik yapar.
Bu sadece olası bir tasarım örneğidir (Java'da):
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
ve VictorBorga
sınıflardan ziyade nesne olması gerektiğini hissediyorsunuz - örneğin, örneğin. public class Pianist implements Musician
ve victorBorge = new Pianist();
vb
Başka bir soru için polimorfizme üst düzey bir bakış sağladım:
Umarım yardımcı olur. Bir özü ...
... bunun için basit bir testten ve [polimorfizm] 'in tanımından başlamaya yardımcı olur. Kodu düşünün:
Type1 x;
Type2 y;
f(x);
f(y);
Burada,
f()
bazı işlemler yapmak ve değerlerix
vey
girdi olarak verilmektedir . Polimorfikf()
olabilmek için , türe uygun kod bularak ve yürüterek en az iki farklı tipte (örn.int
Vedouble
) değerler ile çalışabilmelidir .
( c ++ ' da Polimorfizmde devam etti )
Polimorfizm, bir nesnenin birçok formu üstlenebilme yeteneğidir. OOP'ta polimorfizmin en yaygın kullanımı, bir alt sınıf nesnesine başvurmak için bir üst sınıf başvurusu kullanıldığında ortaya çıkar. Java ile yazılmış bu örnekte üç tip aracımız var. Üç farklı nesne yaratıyoruz ve tekerlek yöntemini çalıştırmaya çalışıyoruz:
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");
}
}
Sonuç:
Daha fazla bilgi için lütfen https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java adresini ziyaret edin . Umut ediyorum bu yardım eder.
Çok biçimlilik, programcının, bu nesnelerin ihtiyaçlarına bağlı olarak, farklı nesne türleri için farklı şeyler yapan aynı adlı yöntemleri yazma yeteneğidir. Örneğin, denilen bir sınıf Fraction
ve denilen bir sınıf geliştiriyorsanız ComplexNumber
, her ikisi de denilen bir yöntem içerebilir display()
, ancak her biri bu yöntemi farklı şekilde uygular. Örneğin PHP'de bunu şu şekilde uygulayabilirsiniz:
// 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";
Çıktılar:
This is a fraction: 1/2
This is a complex number: 1 + 2i
Diğer bazı cevaplar, polimorfizmin sadece kalıtımla birlikte kullanıldığını; örneğin, belki Fraction
ve ComplexNumber
adı verilen özet bir sınıfı uygulanması hem Number
bir yöntemi vardır display()
her iki uygulamaya zorundadır Kesir ve ComplexNumber. Ama ihtiyacın yok polimorfizmden yararlanmak için kalıtım .
En azından PHP gibi dinamik olarak yazılan dillerde (C ++ veya Java hakkında bilmiyorum), polimorfizm, geliştiricinin, nesnenin türünü önceden bilmeden ve yöntemin doğru uygulanacağına güvenmeden bir yöntemi çağırmasına izin verir. olarak adlandırılabilir. Örneğin, kullanıcının Number
oluşturulan türü seçtiğini varsayalım :
$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";
Bu durumda, display()
geliştirici kullanıcının bir kesir mi yoksa karmaşık bir sayı mı seçeceğini önceden bilemese de uygun yöntem çağrılır.
Polimorfizm, kelimenin tam anlamıyla, çoklu şekiller anlamına gelir. (veya birçok form): Farklı sınıflardan ve aynı ad yönteminden nesne, ancak iş akışları farklı. Basit bir örnek:
Bir kişiyi düşünün X.
O sadece bir kişi ama o kadar çok davranıyor. Nasıl sorabilirsiniz:
Annesinin oğlu. Arkadaşlarına bir arkadaş. Kız kardeşine bir erkek kardeş.
OOP'daki polimorfizm, bir sınıfın farklı tiplere sahip olabileceği anlamına gelir, kalıtım polimorfizmi uygulamanın bir yoludur.
Örneğin, Şekil bir arabirimdir, Kare , Daire , Elmas alt tiplerine sahiptir. Şimdi bir Kare nesneniz var, Kare bir Şekle otomatik olarak ulaştırılabilir, çünkü Kare bir Şekildir. Ancak Shape'den Square'e küçümsemeye çalıştığınızda, açık tip döküm yapmanız gerekir, çünkü Shape Square olduğunu söyleyemezsiniz, Circle da olabilir. böylece Square s = (Square)shape
şekil Circle ise, Circle elde edeceğiniz için alacağınız kodla manuel olarak dökmeniz gerekir java.lang.ClassCastException
.
Polimorfizm:
Referans değişkeninin türüne değil, sınıf örneğine göre farklı yürütme.
Bir arabirim türü başvuru değişkeni, bu arabirimi uygulayan herhangi bir sınıf örneğine başvurabilir.
Polimorfizm, belirli bir sınıfta bir nesneyi kullanma yeteneğidir; burada nesneyi oluşturan tüm bileşenler, verilen sınıfın alt sınıfları tarafından miras alınır. Bu, bu nesne bir sınıf tarafından bildirildikten sonra, altındaki tüm alt sınıfların (ve alt sınıfları vb.), En uzak / en düşük alt sınıfa ulaşıncaya kadar nesneyi ve bileşenlerini (makyaj) devralana kadar devam eder.
Her sınıfın ayrı dosyalara kaydedilmesi gerektiğini unutmayın.
Aşağıdaki kod Polimorfizmi örneklendirmektedir:
Üst Sınıf:
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");
}
}
Bir alt sınıf olan baba:
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.");
}
}
Çocuk, başka bir alt sınıf:
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?");
}
}
Yürütme yöntemi, başlangıç sınıfına başvuruyor:
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();
}
}
Her sınıfın ayrı * .java dosyalarında bildirilmesi gerektiğini unutmayın. Kod derlenmelidir. Ayrıca maidenName ve familyTree'yi daha da aşağı kullanabileceğinizi unutmayın. Bu polimorfizm kavramıdır. Kalıtım kavramı burada da incelenir, burada bir sınıf kullanılabilir veya bir alt sınıf tarafından tanımlanabilir.
Umarım bu yardımcı olur ve netleştirir. Kodu doğrulamak için kullanabileceğim bir bilgisayar bulduğumda sonuçları yayınlayacağım. Sabrınız için teşekkürler!
Polimorfizm aynı rutinin (fonksiyon, yöntem) farklı tipler üzerinde hareket etmesine izin verir.
Birçok mevcut cevap alt tiplemeyi polimorfizmle karıştırdığı için, polimorfizmi uygulamanın üç yolu (alt tipleme dahil).
Ayrıca bakınız:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
Nesneye Yönelik dillerde, polimorfizm, farklı veri türlerinin aynı arabirim üzerinden işlenmesine ve işlenmesine izin verir. Örneğin, C ++ 'da kalıtım düşünün: Sınıf B, Sınıf A'dan türetilir. A * türünde bir işaretçi (A sınıfı işaretçiden A işaretçisine) hem A sınıfı bir nesneyi hem de B sınıfı bir nesneyi işlemek için kullanılabilir.
Kodlama terimlerinde polimorfizm, nesnenizin kalıtım vb. Yoluyla birden çok tür olarak var olduğu zamandır. Nesnenizin sahip olduğu kenar sayısını tanımlayan "Shape" adlı bir sınıf oluşturursanız, bunu "Square" gibi miras alan yeni bir sınıf oluşturabilirsiniz. ". Daha sonra bir "Square" örneği oluşturduğunuzda, bunu gerektiği şekilde "Shape" den "Square" e geri ve ileri sarabilirsiniz.
Polimorfizm size başka bir modül çağıran bir modül oluşturma ve yine de kontrol akışı yerine kontrol akışına karşı derleme zaman bağımlılığı noktasına sahip olma yeteneği verir.
Çok biçimlilik kullanarak, yüksek seviyeli bir modül düşük seviyeli modüle bağlı değildir. Her ikisi de soyutlamalara bağlıdır. Bu, bağımlılık tersine çevirme ilkesini uygulamamıza yardımcı olur ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).
Yukarıdaki tanımı burada buldum. Eğitmen videoya yaklaşık 50 dakika içerisinde yukarıda anlatıldığını açıklıyor. https://www.youtube.com/watch?v=TMuno5RZNeE
Polimorfizm:
Özelleştirilmiş türün bir örneğinde, genelleştirilmiş türün yöntemini çağırırken yalnızca genelleştirilmiş türünü bilerek bir işlemi başlatın: dinamik polimorfizmdir .
Kaydetme adına sahip ancak farklı parametrelere sahip çeşitli yöntemler tanımlayın: statik polimorfizmdir .
İlk tarihsel tanım ve en önemlisiyse.
Sınıf hiyerarşisinin güçlü bir şekilde yazılan tutarlılığını oluşturmaya ve türlerini bilmeden farklı türdeki nesnelerin listelerini yönetmek gibi büyülü şeyler yapmayı sağlar , ancak veri türlerinin yanı sıra ana türlerinden yalnızca birini.
Nokta, Çizgi, Dikdörtgen ve Daire gibi çizmek için zaman aşımını ayarlamak üzere hiçbir şey veya parametre almayan Draw () işlemine sahip bazı Şekiller.
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();
Burada Shape sınıfı ve Shape.Draw () yöntemleri soyut olarak işaretlenmelidir.
Anlamak için değiller.
Polimorfizm olmadan, soyut-sanal-geçersiz kılma kullanarak, şekilleri ayrıştırırken, CLR olarak adlandırılan sadece Spahe.Draw () yöntemidir. Bu yüzden, üzerinde hareket ettiğimiz türün yöntemini çağırır ve burada liste bildirimi nedeniyle tür Şekil'dir. Kod hiç bir şey yapmaz.
Çok biçimlilik ile CLR, sanal tablo olarak adlandırılan şeyi kullanarak üzerinde hareket ettiğimiz nesnenin gerçek türünü çıkarabilir . Yani iyi diyor yöntemi ve burada Shape Point ise Shape.Draw () öğesini çağırmak Point.Draw () öğesini çağırır. Böylece kod şekilleri çizer.
Java'da Çok Biçimlilik (Seviye 2)