Polimorfizm nedir, ne işe yarar ve nasıl kullanılır?


564

Polimorfizm nedir, ne işe yarar ve nasıl kullanılır?


19
@John: +1 Bunun çok ilginç bir fenomen olduğuna katılıyorum. Eminim Unkwntech, başkalarının temel bir kelime dağarcığı olarak kabul edeceği şeylerde boşlukları olan tek bilgili, yetenekli birey değildir. Programlamanın çok geniş bir konu olduğunu gösteriyor.
AnthonyWJones

9
Kullanabilir, sadece bir isim vermez.
Aiden Bell

10
@Aamir: 8k'lık birisinin programlamanın tüm alanlarındaki tüm temel unsurları bildiğini varsaymanın makul olduğundan emin değilim. Ayrıca itibar sisteminin kusurlu olduğunu gösterdiğini sanmıyorum. Birisi çok iyi sorular sorarak hatırı sayılır bir itibar kazanabilir. Bu vahiye verdiğimiz doğal tepkinin basitçe biz (programcılar) biraz dar fikirli olma eğiliminde olduğumuzu gösteriyor (bazı spesifik teknik alanlarda gerçekten iyi olmamız gerektiğinde kötü bir şey değil) ve bunun dezavantajları var.
AnthonyWJones

43
Çok sınırlı bir programlama görüşünüz var. OO kavramları hakkında hiçbir bilgiye sahip olmayan (veya buna ihtiyaç duymayan) gömülü geliştirme yapan adamları biliyorum. Onların özeti, kodun her son atomunu sıkmaktır ve işte bu - üzerinde çalıştıkları kod asla nesnelerin dünyasına girmeyecek ve endişelenmek zorunda kalmadıkları için emekliliğe yeterince yakınlar. ikiden fazla harf ile nesneler, polimorfizm ve değişken isimleri gibi yeni kavramlar öğrenme :-)
paxdiablo

29
Bir şeyi nasıl öğreniyorsun? Kimse PHP OOP ve tasarım kalıplarını bilerek bu dünyaya gelmedi, bu yüzden bir noktada hepiniz bunu öğrenmek zorundasınız , kolejde, burada bir cevap, vs. Birinden bahsetme "zaten karmaşık kod prosedürlerini bilmiyor "ve bunun yerine burada öğrenmek istediklerini düşünün, ki bu iyi bir şey ve bu sitenin amacı. Eminim olarak, onlara yardımcı zamanınızı kullanın Eğer ettik geçmişte yardımcı olmuştur. İnsanın tarihi boyunca, bilgiyi paylaşmak yerine, cevap "Ne? Ha! Bunu bilmiyor musun? .." olsaydı, hepimiz hala karanlık çağlarda olurdu ..
James

Yanıtlar:


544

Terimin Yunan kökenleri hakkında düşünürseniz, bu belirginleşmelidir.

  • Poly = many: polygon = çok taraflı, polistiren = birçok stiren (a) , polyglot = birçok dil vb.
  • Morph = değişim veya form: morfoloji = biyolojik form çalışması, Morpheus = Yunan rüyası tanrısı herhangi bir form alabilir.

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 BigDecimalveya Rationalya Imaginaryda farklı veri türleri üzerinde işlem olsa da, bu işlemleri sağlayabilir.

Klasik örnek, Shapesı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, pancak şimdi şakayı açıklamak zorunda kaldım, hatta bu da komik görünmüyor.

Bazen, geride kalırken bırakmalısın :-)


50
Yunanca değil, Latince :) ('y' ve 'ph' hediyelerdir). Ve Yunancada, 'biçim' sadece 'şekil' ya da 'biçim'dir -' biçim 'için' şekil değiştir 'in İngilizce anlamı daha sonraki bir gelişmedir
AakashM

16
Polimorfizm OOP ile ilişkili değildir, ancak OOP polimorfizm ile ilgilidir, çünkü doğal olarak onu destekler (iyi bir OOP dili olduğunu varsayarak). Diğer polimorfizm örnekleri için FP'ye bakınız.
alternatif

9
Bu 2 satır benim için hile yaptı:Poly = many and Morph = change or form
Jo Smo

3
Polip, polipo (u) s için kısadır. Ve şiir yunanca ayaktır. ;-)
Dirk

2
@Shaun, bence "arabirim" terimini çok fazla edebi / daraltıcı bir anlamda kullanıyor olabilirsiniz - bunu bazı bilgisayar dillerine özgü bir tanımdan ziyade İngilizce bir terim olarak kastettim. Tam olarak aynı parametrelerle tam olarak aynı işlev anlamına gelmez, sadece altta yatan beton türlerinden bağımsız olarak aynı şekilde "nesneleri" etkilemenin bir yoludur. Bu, farklı parametre tipleriyle aşırı yükleme yönteminin yanı sıra daha saf polimorfizm formunu içerebilir.
paxdiablo

250

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.


6
Bu açıkça ebeveyn arayüzünü gösteren çok iyi bir örnek olduğunu ve nesne araba vs, somut bir sürümü gerekli olduğunu yani aracın örneği kadar olmadığını düşünüyorum
wired00

1
Bir PHP programcısı iseniz, bu bağlantı İLK incelemek daha kolay olabilir ve daha sonra hala bu bir bakmak olsa da, bunun en açık örnek olduğunu söyleyebilirim: code.tutsplus.com/tutorials/…
Oliver Williams

Ayrıca (OP'nin kapsamının ötesinde), analizi bilinen nesnelere kısıtladığımızı belirtmek için; bir nesneyi aktarmıyoruz (bir içe aktarma dosyası gibi) ve ardından ne tür olduğunu (Excel, CSV, YAML, SQL vb.) İçin fabrika sınıfının çeşit gerekir bu bir yapmak için Class_Excel, Class_CSVbir çağrılacak ya sahip Readeradlandırılan sınıfı. Her iki durumda da, / then / else bir yerde saklanacaksa, bir tür yinelemeli.
Oliver Williams

@Antony Gibbs: Bu benim için anlamlı olan gerçekten iyi bir örnek (jenerik tiplerin bir listesi) .... aksi takdirde her sınıfın bir temel sınıftan miras almadan kendi tekerlekleri fonksiyonuna sahip olmasının en önemli yanı nedir? Listenin yanı sıra polimorfik için iyi olacak başka kavramlar var mı?
TTT

195

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.


10
düğme benzetmesi soyutlama kavramıyla daha fazla ilgili değil mi?
thewpfguy


8
@Mantriur: Bu gerçekten intihal ve buna karşı kurallarımız var: stackoverflow.com/help/referencing Ancak şimdi puanı ve eski mesajların cevap silme sırasında tekrar kaybından muaf olduğu gerçeği göz önüne alındığında, silme konusunda emin değilim şimdi her şey düzelecek. Bir sonraki en iyi alternatif, kullanıcıların kendi cevaplarında kaynaklara atıfta bulunmaktan sorumlu olduğuna inanmama rağmen, sadece kullanıcı adına atıfta düzenleme yapmak olacaktır.
BoltClock

1
Geçici polimorfizmin veya parametrik polimorfizmin sınıfları ve / veya nesneleri nasıl gerektirmediğini görerek polimorfizmin sınıflara ve / veya nesne yönelimli programlamaya özgü olduğunu ima etmenin yanlış olduğuna inanıyorum. Bu cevabın neden bahsettiğinin alt tipleme (alt tip polimorfizm veya inklüzyon polimorfizmi olarak da bilinir) olduğunu düşünüyorum.
StubbornShowaGuy

64

Birisi bu insanlara CUT diyorsa

  1. Cerrah
  2. Saç Stilisti
  3. Aktör

Ne olacak?

  • Cerrah bir kesi yapmaya başlar.
  • Saç Stilisti birisinin saçını kesmeye başlar.
  • Aktör, yönetmenlik rehberliği bekleyerek mevcut sahneden çıkmayı aniden durduracaktı.

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.


5
Bunun harika bir örnek olduğunu düşünmüyorum, çünkü deneyimsiz insanları iki sınıfın bir .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.
Matt Klein

37

Analoji ile Basit Açıklama

Amerika Birleşik Devletleri Başkanı polimorfizm kullanıyor. Nasıl? Pek çok danışmanı var:

  1. Askeri Danışmanlar
  2. Hukuk Müşavirleri
  3. Nükleer fizikçiler (danışman olarak)
  4. Tıbbi danışmanlar
  5. vesaire vesaire.

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 nasıl uygulanır - bir temel sınıf veya ortak bir arabirim aracılığıyla

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 IAdvisorsadece 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);
        }
    }

özet

Gerçekten bilmeniz gereken şey şudur:

  • Başkanın özelliklerini bilmesine gerek yok - bunlar başkalarına bırakıldı.
  • Başkanın bilmesi gereken tek şey, ona tavsiyede bulunmak için kimin kapıya yürüdüğünü sormaktır - ve tavsiye istendiğinde ne yapacaklarını kesinlikle bileceklerini biliyoruz (çünkü hepsi gerçekte, danışmanlar (veya IAdvisors :))

Umarım size yardımcı olur. Eğer bir şey anlamıyorsanız yorum göndermek ve ben tekrar deneyeceğim.


4
Harika bir örnek! Teşekkürler.
Iman Sedighi

1
Çok ilginç bir benzetme. Teşekkür ederim.
thanhtang

1
@TTT çünkü (1) her yeni danışmanınız olduğunda başkan sınıfını değiştirmek zorunda kalırsınız - x2 değişiklik yapmak istemezsiniz. sadece bir tane. (2) ikincisi, mevcut bir danışmanı değiştirmeniz gerekiyorsa, o zaman geri dönüp başkan sınıfındaki bu üç çağrıdan birini değiştirmeniz gerekebilir - iki değil, sadece bir değişiklik yapmak istersiniz. (3) üç ayrı çağrınız varsa, başkan sınıfı içinde sormanız gerekir : 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.
BKSpurgeon

1
@ TTT evet haklısın. ama yavaş yavaş okuyucular için kavram tanıtmak zorunda aksi takdirde onlar anlamayacak. başka değişiklikler ekledim. Lütfen açıklamalar
gerekip

1
@TTT taban sınıfı vs arabirim, programcıların polimorfizm yaparken vermeleri gereken bir tasarım kararlarıdır. daha fazla ayrıntı için buraya bakın: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon

24

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;

Acaba bu nasıl @Ajay Patel'inclasses have different functionality while sharing a common interface
BornToCode 5:14)

1
@BornToCode Üst sınıf bu ortak arabirimdir / sağlar.
grokmann

1
Çok biçimlilik alt tipleme gerektirmez.
Shaun Luttin

22

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.


Aşırı yükleme kavramının kalıtım ve çok biçimlilik ile ilgisi yoktur.
srk

@srk Yöntem aşırı yükleme, polimorfizmi uygulamanın bir yoludur. Genellikle statik veya ad hoc polimorfizm olarak sınıflandırılır. wiki.c2.com/?CategoryPolymorphism
Shaun Luttin

12

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.


10
"A tipi bir nesnenin B tipi bir nesne gibi davranma yeteneği" - bu doğru bir tanım değildir. Daha çok A tipi bir nesneye, B tipi bir nesne gibi davranma yeteneği gibi olduğunu söyleyebilirim.
Artem Barger

Evet. Belki bu daha iyi bir ifadedir.
JesperE

Bütünlük için, birçok dil ördek yazarak polimorfizmi uygular, örneğin Python.
ilya n.

Acaba bu nasıl @Ajay Patel'in verdiği (popüler) açıklama ile ilgiliclasses have different functionality while sharing a common interface
BornToCode

9

Ç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


2
Bu özellikle alt tip polimorfizmdir.
Shaun Luttin

@ vinko-vrsalovic: kırsal Amerika'da yazılım geliştirme nasıl?
TTT

8

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.


2
Bu, sadece bir tür polimorfizm olan alt tiplemedir.
Shaun Luttin

@ShaunLuttin diğer polimorfizm türleri hakkında daha fazla bilgi edinmek için beni herhangi bir kaynağa yönlendirebilir misiniz?
Abe Miessler

Bunlar, "alt tip polimorfizm" e ek olarak "ad hoc polimorfizm" ve "parameterik polimorfizm" dir.
Shaun Luttin

8

(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.


5

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.


4

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ı :)


3

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());
}

1
AnnHallowayve VictorBorgasınıflardan ziyade nesne olması gerektiğini hissediyorsunuz - örneğin, örneğin. public class Pianist implements Musicianve victorBorge = new Pianist();vb
Przemek D

3

Başka bir soru için polimorfizme üst düzey bir bakış sağladım:

C ++ 'da çok biçimlilik

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ğerleri xve ygirdi olarak verilmektedir . Polimorfik f()olabilmek için , türe uygun kod bularak ve yürüterek en az iki farklı tipte (örn. intVe double) değerler ile çalışabilmelidir .

( c ++ ' da Polimorfizmde devam etti )


3

Polimorfizm, birçok formda alınabilen bir nesne yeteneğidir. Örneğin insan sınıfında ilişkiler hakkında konuştuğumuzda insan birçok şekilde hareket edebilir. EX: Bir adam oğlunun babasıdır ve karısının kocasıdır ve öğrencilerine öğretmendir.


3

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ç:

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.


Evet, ama polimorfizmin faydalarını açıklamadınız. Araç sınıfını sildiğiniz ve yine de çalışacağı (tabii ki farklı bir nesne bildirimi ile) daha kısa bir kod var.
Cornelius

Açıklamamıştım, çünkü soruyu soran kişi faydaları sormadı. "Çok biçimlilik nedir, ne işe yarar ve nasıl kullanılır?" Diye sordu. Kod hakkında, daha iyi yapabilirseniz, lütfen cevabınızı gönderin. Yani, topluluğumuz bunu kullanabilir. Yorumun için teşekkürler.
Muhammed

Üzgünüm, kaba görünmek istemiyordu, diğerleri de açıklamıyordu. En azından kodu yazmak için uğraştınız. Her neyse, bunun ne için olduğunu sordu, ancak bu sayfadaki örneklerin hiçbiri ne için olduğunu açıklamıyor. Hepiniz bununla aynı sonuçları elde etmek için karmaşık bir yol sunuyorsunuz : s28.postimg.org/jq8vl6031/Poly.jpg ve hiçbiri neden polimorfizmi kullanmak istediğini açıklamak için umursamadı, kazancı veya amacı nedir, ne olamazdı kullanılmadığı takdirde yapılmış mı? Bu sayfada gördüğüm tek şey asansör değil, merdiven kullanarak dairenize tırmanmak için bir teklif ..
Cornelius

.. bir kişinin asansöre sığamayacak kadar büyük bir bayrak direği taşıdığını fark etmeden. Kod
Cornelius

2

Ç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 Fractionve 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 Fractionve ComplexNumberadı verilen özet bir sınıfı uygulanması hem Numberbir 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 Numberoluş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.


2
Bu polimorfizm değil. Bu, aynı adlı yöntemlere sahip iki sınıf. Bunların "görüntülenebilir" veya benzer bir adla adlandırılan bir temel sınıf veya arabirim ile bağlanması gerekir ve daha sonra diğer yöntemler, nesnenin Karmaşık veya Kesir yerine "görüntülenebilir" türünde olmasını sağlar.
Pod

Hep polimorfizmi düşünce oldu "iki sınıfları aynı nome yöntemlerinden birinin." Aslında, Stephan Kochan'dan (bu Kesir / Karmaşık örneği söktüğüm utanmadan) alıntı yapmak için, "aynı yöntem adını farklı sınıflar arasında paylaşma yeteneği çok biçimlilik olarak bilinir." ( Programming_In_Objective-C'den ) Sınıfları bir temel sınıf aracılığıyla bağlama gereğinden bahsetmez. Belki farklı dillerde farklı, dürüstçe bilmiyorum.
Alex Basson

Bu sanığın yayınlanmış bir kitaptan alıntılanması zor olsa bile, yine de yanlış olduğunu iddia ediyorum. Özellikle birbirleriyle çatıştığı göründüğünden, polimorfizmin dil agnostik defenisyonu. Ve nihai sonuç polimorfizm ile görüldüğü gibi olsa da, bunun yerine programcının bir yöntemin diğer benzer yöntemler arasında doğru uygulanmasının çağrılmasını sağlayan dinamik yazmanın olduğunu iddia ediyorum.
vipirtti

2

Nesne yönelimli programlamada, polimorfizm, bir programlama dilinin veri türüne veya sınıfına bağlı olarak nesneleri farklı şekilde işleme yeteneğini ifade eder . Daha spesifik olarak, türetilmiş sınıflar için yöntemleri yeniden tanımlama yeteneğidir.


2

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ş.


2

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.


2

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.


1

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!


2
her çocuğun bir ebeveyn olmadığını ve bu yapının yanlış olduğunu unutmayın. Birinci sınıf, Adem dışında her zaman geçerli olacak Çocuk olmalıdır (sadece "Kişi" ile başlamıyorsanız). Yaratan, insan aklının herhangi bir yapısıyla tanımlanamayacağı için parent_id değerini null değerine ayarlayabilirsiniz.
Yehosef

1

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).

  • Parametrik (jenerik) polimorfizm , bir rutinin normal parametrelere ek olarak bir veya daha fazla tip parametresini kabul etmesine izin verir ve kendini bu tiplerde çalıştırır.
  • Tipi polimorfizm , bir rutinin parametrelerinin herhangi bir alt türü üzerinde hareket etmesine izin verir.
  • Geçici polimorfizm , polimorfik davranışlar vermek için genellikle rutin aşırı yüklenmeyi kullanır, ancak diğer polimorfizm uygulamalarına da başvurabilir.

Ayrıca bakınız:

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

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


0

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.


0

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.


0

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


0

Polimorfizm nedir?

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.

Polimorfizm ne için kullanılır?

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.

Güçlü ve zayıf yazma

Örneklem

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.

Açıklama

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.

Daha fazla okuma

Polimorfizm (Seviye 1)

Java'da Çok Biçimlilik (Seviye 2)

Çok Biçimlilik (C # Programlama Kılavuzu)

Sanal yöntem tablosu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.