Çok Biçimlilik - Yalnızca İki Cümlede Tanımlayın [kapalı]


85

Diğer tanımlara ve açıklamalara baktım ve hiçbiri beni tatmin etmiyor. Hiç kimsenin herhangi bir kod veya örnek kullanmadan en fazla iki cümlede polimorfizmi tanımlayıp tanımlayamayacağını görmek istiyorum. 'Öyleyse bir kişinin / araban / konserve açıcın var ...' ya da kelimenin nasıl türetildiğini duymak istemiyorum (hiç kimse, poli ve morfun ne anlama geldiğini bildiğinden etkilenmiyor). Polimorfizmin ne olduğunu çok iyi anlıyorsanız ve iyi derecede İngilizce bilgisine sahipseniz, bu soruyu yoğun da olsa kısa bir tanımla cevaplayabilmelisiniz. Tanımınız polimorfizmi doğru bir şekilde tanımlıyor, ancak birkaç okuma gerektirecek kadar yoğunsa, o zaman tam olarak aradığım şey bu.

Neden sadece iki cümle? Çünkü bir tanım kısa ve zekidir. Bir açıklama uzundur ve örnekler ve kod içerir. Açıklamalar için buraya bakın (bu sayfalardaki cevap sorum için tatmin edici değil):

Çok Biçimlilik - Geçersiz Kılma - Aşırı Yükleme Karşılaştırması Çok
biçimliliği olabildiğince kolay anlatmaya çalışın

Neden bu soruyu soruyorum? Çünkü bana aynı soru soruldu ve tatmin edici bir tanım bulamadığımı fark ettim (benim standartlarıma göre, oldukça yüksek). Bu sitedeki büyük beyinlerin bunu yapıp yapamayacağını görmek istiyorum.

İki cümle şartını gerçekten yerine getiremiyorsanız (tanımlanması zor bir konudur), o zaman üzerinden geçerseniz sorun yok. Buradaki fikir, polimorfizmin ne olduğunu gerçekten tanımlayan ve ne yaptığını veya nasıl kullanılacağını açıklamayan (farkı anladınız mı?) Bir tanıma sahip olmaktır.


Tek isim, çoklu uygulama.
Prosunjit Biswas

2
Bu soruyu bir iş görüşmesinde sordum. Bunu bir iş görüşmesinde sormanın elitist bir züppe eylemi olduğunu hissettim, bir Google çalışanının kimsenin etkili bir şekilde cevap veremeyeceğini varsayarak kendini beğenmiş bir şekilde soracağı türden bir şey. İşi cevaplayamadığınız için almadıysanız, kimleri alt edebileceğinizden ziyade ne yapabileceğinizle daha fazla ilgilenen insanlar için çalışmak muhtemelen daha iyidir.
MagicLAMP

Çok biçimlilik, gelişimde anlaşılması çok önemli bir kavramdır. Resmi tanımı değilse de en azından değerini anlamayı şiddetle tavsiye ederim. En azından Strateji modelinin nasıl çalıştığını ve değerini açıklayabilmeyi öneriyorum.
Chad Johnson

Yanıtlar:


106

Çok biçimlilik, bir tür sözleşmenin ifadesine izin verir, potansiyel olarak birçok tür bu sözleşmeyi (sınıf mirası yoluyla olsun veya olmasın) her biri kendi amaçlarına göre farklı şekillerde uygular. Bu sözleşmeyi kullanan kod , (*) hangi uygulamanın dahil olduğu ile ilgilenmemelidir, yalnızca sözleşmeye uyulacaktır.

(*) İdeal durumda, her neyse - açıkçası çoğu zaman çağıran kod uygun uygulamayı çok bilinçli olarak seçmiştir!


1
Mark, bir noktada bu cevabı kabul edip sonra reddettin mi? İtibar sistemindeki bir hataya neyin benzediğini bulmaya çalışıyorum - bu cevap bana bugün için net -15 rep verdi, garip bir şekilde.
Jon Skeet

Aynı burada, Jon - Şimdi -15 tekrarı ile 2 kabul edilmiş cevabım var. Umursadığımdan değil ama ilgi çekici.
Otávio Décio

3
Açıkçası, "bir türün bir tür sözleşmeyi ifade etmesi" şartı yoktur. Gerçekten gerekli olan tek şey, birden fazla uygulamanın, mesajı gönderenin mesajı hangi uygulamanın işlediğini bilmesine veya önemsemesine gerek kalmadan aynı mesaja yanıt verebilmesidir.
Doug Knesek

3
@Doug: Dokümantasyon veya isimlendirme yoluyla bile ima edilen bir sözleşme yoksa, onun istediğiniz şeyi yapacağını nereden biliyorsunuz? Kendi cevabınızda bir "arayüz" den bahsediyorsunuz - ki bu bana çok bir sözleşme gibi geliyor - aradaki fark nedir? Hem "arayüz" hem de "sözleşme", "güçlü" anlamda (örneğin, derleme zamanında zorunlu kılınan) veya çok gevşek bir şekilde (örneğin, adlandırma ve dinamik yazım kullanarak) kullanılabilen kelimelerdir.
Jon Skeet

1
@Alex: Evet, bu geri döndüreceğim bir düzenleme olurdu - sözlerimi tercih ederim. Yine de her zaman kendi cevabınızı ekleyebilirsiniz.
Jon Skeet

72

Genel bir kural olarak meyve yenebilir, ancak farklı meyve türleri farklı şekillerde yenir. Bir meyve olan elma (bir meyve olduğu için) yenebilir. Muz da yenebilir (çünkü aynı zamanda bir meyve), ancak bir elmadan farklı bir şekilde. Önce sen soy.

En azından biliyorum, ama bazı şekillerde tuhafım, bu yüzden ne biliyorum.

Bu, kalıtımı (meyve yenebilir), polimorfizmi (meyveyi yiyen bir şey her türlü meyveyi yiyebilir) ve kapsüllemeyi (muzun kabuğu vardır) gösterir.

Cidden, nesne kalıtımı, çok biçimlilik, kapsülleme, sanal şeyler, soyut şeyler, özel şeyler, kamusal şeyler, bunların hepsi zor kavramlardır. Birisi kesinlikle bunun 2 cümlelik bir tanımına sahip olmak istiyorsa, lütfen soruyu bir kod-golf varyantı olarak etiketleyin, çünkü bu tür iki cümlenin o kadar kısa olması gerekir ki, zaten ne olduğunu bilmediğiniz sürece hakkında yeterince şey öğrenemezsiniz. ne hakkında daha fazla öğrenmen gerektiğini bilmek.


lassevk: "Zaten ne olduğunu bilmiyorsanız, neyi öğrenmeniz gerektiğini bilecek kadar yeterince öğrenemezsiniz" << Sadece açıklığa kavuşturmak için, beklediğim şey bu. Anlaması biraz düşünmeyi gerektirebilecek bir tanım arıyorum. Yeni başlayanlara öğretmek için kullanılmayacak biri.
Mark Testa

2
Bunu anladım, biraz esprili bir cevap gönderdim (yine de bana) :) Çok biçimlilik ve OOP o büyük duvar şeylerinden biri, burada öğrenme eğrisinin grafiğini çizerseniz, sadece büyük bir duvara çarparsınız ve ya sürünürsünüz ya da yapmazsın. Eğer yaparsanız, genellikle büyük bir AHA'nız olur! deneyim ...
Lasse V.Karlsen

8
Hemlock da bir meyvedir! Onu yiyebilirsin ama sadece bir kez!
James Anderson

@JamesAnderson Yani, bir singleton?
Lasse V.Karlsen

47

Çok biçimlilik, tipe duyarlı olmayan tek tip bir arayüz bildiriyor ve uygulama ayrıntılarını arayüzü uygulayan somut türlere bırakıyor.


Bu inanılmaz derecede kısa ve bence mükemmel bir şekilde uyuyor
Alex W

21

Wikipedia: Polimorfizm, farklı veri türlerinin değerlerinin tek tip bir arayüz kullanılarak işlenmesine izin veren bir programlama dili özelliğidir. Benim için oldukça basit.


21

Aslında, polimorfizmin çoklu biçimleri vardır ve bununla ilgili oldukça tartışmalar vardır; hatta onu doğru şekilde tanımlayamayan bilgisayar bilimleri profesörlerini bile görebilirsiniz. Üç türün farkındayım:

  • ad-hoc polimorfizm (ördeğe benzer ve ördek gibi yürür => ördekdir). Örneğin Haskell ve Python'da görülebilir.

  • genel polimorfizm (burada bir tür, bazı genel türlerin bir örneğidir). Örneğin C ++ 'da görülebilir (int vektörü ve dizge vektörünün her ikisi de üye işlev boyutuna sahiptir).

  • alt tür polimorfizmi (bir türün başka bir türden miras aldığı yer). Çoğu OO programlama dilinde görülebilir (yani Üçgen bir Şeklidir).


2
Farklı polimorfizm türleri olduğundan bahsetmek için +1. Bununla birlikte, geçici polimorfizm tanımınız en.wikipedia.org/wiki/Type_polymorphism adresinde belirtilenden oldukça farklı görünüyor . Bu sayfada 3 değil 2 tür (ad-hoc ve parametrik) olduğunu ve ayrıca polimorfik işlevler ile polimorfik veri türleri arasında bir ayrım yaptığını söylüyor. Belirleyebildiğim kadarıyla 3 tipiniz, sırasıyla parametrik polimorfik fonksiyonlara, parametrik polimorfik veri tiplerine ve ad-hoc polimorfik fonksiyonlara karşılık gelir.
Laurence Gonsalves

merhaba, "bazı genel türden örnekler" ile "başka bir türden miras alır" arasındaki fark nedir, bunlar aynı şeyi söylüyor gibi görünüyor?
Shanimal

@LaurenceGonsalves fwiw, ilk yorumda sağlanan bağlantı üç türe işaret ediyor. Parametrik polimorfizm, bir işlevin veya bir veri türünün "genel olarak" yazılmasına izin vermek olarak tanımlanır.
Shanimal

14

Bu soruyu neden sorduğunuzu gerçekten anlıyorum. Polimorfizmi anlıyorum, ancak bir iş görüşmesindeydim ve polimorfizmin kısa ve net bir tanımını vermem istendi. Net ve kısa bir tanım veremediğim için düşünmeye başladım ve işte benim tanımım:

Bir türdeki nesnelerin bir ve aynı arayüze sahip olma yeteneği, ancak bu arayüzün farklı uygulaması.


10

Tanım :

Polimorfizm 1 dolarlık bir fikir için 10 dolarlık bir kelimedir - bir şeyin yapılmasını istediğimde, sonuç uygun olduğu sürece nasıl başarılacağı umurumda değil. Sürece itibariyle hizmet düzgün sağlanır, ben umursamıyorum hakkında uygulanması .

Tartışma

Yaygın olarak yazılım geliştirmede kullanılırken, özellikle nesne yönelimli ilkelere göre geliştirilen sistemlerde, Polimorfizm temelde gerçek bir dünya prensibidir ve teknolojik değil gerçek dünya terimleriyle tanımlanmalıdır.

Örnekler

Bir telefon görüşmesi yapmak istediğimde, bir telefon açıyorum, bir numara çeviriyorum ve karşı taraftaki tarafla konuşuyorum. Telefonu kimin yaptığı, hangi teknolojiyi kullandığı, kablolu, kablosuz, mobil veya VOIP veya garanti kapsamında olup olmadığı umurumda değil.

Bir belgeyi yazdırmak istediğimde onu yazdırırım. Uygulama dili, yazıcının markası, bağlantı şekli, sarf malzemesi seçimi veya kağıt kalitesi umrumda değil.


5
Encapsulationbana örnek gibi geliyor
Singleton

1
Polimorfizm, Kapsülleme ve Soyutlama, farklı bakış açılarına odaklansalar da oldukça yakından ilişkilidir. İyi soyutlamalar, polimorfizmin elde edilmesini kolaylaştırır ve iyi kapsülleme, ayrıntıların "sızmasını" önlemeye yardımcı olur.
Bevan

10

Aynı arayüzün birden çok uygulaması.

Örnek: Birçok telefon modeli sayısal tuş takımı arabirimini kullanır.


8

Çok biçimlilik, kodu basitleştirmeye yardımcı olmak için nesne modelleri tasarlarken kullanılan nesne yönelimli bir stratejidir. Temel polimorfizmi, iki benzer ancak farklı nesneyi tanımlama ve ardından iki nesneyi aynı gibi ele alma yeteneğidir.

Tamam bu zor ....


7

Polimorfizmin ne olduğuna dair kendi yorumumu ekleyeceğimi düşündüm: Çok genel olarak, polimorfizm, farklı türlerdeki varlıklara tek bir arayüz sağlama eylemidir .

Bu oldukça genel, ancak bildiğim üç tür polimorfizmi de sarmanın tek yolu bu: ad hoc , parametrik ve alt tip . Aşağıda daha fazla ayrıntıya gireceğim ve polimorfizm türlerini alfabetik olarak ada göre sıraladım. İlgilendiğiniz, büyük olasılıkla alt tip polimorfizmdir sonuncusu olan .

Ad hoc polimorfizm

Ad hoc polimorfizm , farklı parametre türleri için aynı yöntemin birden çok uygulamasını sağlama eylemidir. Olarak OOP bu genelde bilinen bir yöntem aşırı yüklenmesi . Örneğin:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Her iki formatyöntem de tek bir arabirimi paylaşır , ancak farklı türlerdeki varlıklar üzerinde çalışırlar .

Parametrik polimorfizm

Parametrik polimorfizm , bir sınıfın (veya yöntemin) kendisi sınıfın (veya yöntemin) bir parametresi olan bir tür üzerinde çalışmasını sağlama eylemidir. Genellikle jenerik olarak anılır .

Örneğin, Java List[T]bir parametre bekliyorT , örnekleme zamanında ve bu parametre, ortaya çıkan nesnenin türünü tanımlar.

Ham türleri kasıtlı olarak görmezden geldiğime dikkat edinBu bağlamda suları çamurlayacaklarını hissettiğim için geldiğime dikkat edin.

List[String]ve tek bir arayüzüList[Date] paylaşın , ancak farklı türlerde çalışın (ve bunlar) .

Alt tip polimorfizmi

Alt tip polimorfizmi , muhtemelen başlangıçta sorunuzda kastettiğin şeydir: Bu, aynı türden birden çok uygulamaya tek bir arayüz sağlama eylemidir.

Geleneksel örneği kullanmak için: Animaltüm uygulamaların uyması gereken bir sözleşme sağlar. Dogbir Animalve bu nedenle Animalbildiren tüm işlemleri destekler . Göre Liskov ikame prensibi , bu bir örneğini kullanmanıza olanak sağlar Dogörneğidir nerede Animal(yaklaşık ancak diğer şekilde) bekleniyor.

Eğer Catve Dogher ikisi de alt sınıflarıysa, tek bir arayüzüAnimal paylaşırlar ancak aslında farklı türlerdir. .

Burada biraz teğet geçiyorum, ancak alt tip polimorfizmi (sanırım) geçersiz kılmaya izin veren tek şey : bir ana sınıf tarafından tanımlanan bir yöntemin davranışını yeniden tanımlama eylemi. Bu genellikle , daha önce gördüğümüz gibi, bir tür polimorfizm olan ve aslında alt sınıfa ihtiyaç duymayan (gerçekten de sınıflara ihtiyacı olmayan) aşırı yükleme ile karıştırılır .


peki ya arayüz tabanlı polimorfizm?
siamak

@siamak, ebeveyn türün tamamen soyut olduğu belirli bir tür alt tip polimorfizmi değil mi? Yoksa başka bir şey mi kastediyorsun?
Nicolas Rinaudo

Arayüz niyetim, bunun gibi Nesne Yönelimli dillerde bulunan bir Referans Türü olarak Arayüzdür: Arayüz I1 {void M ();} Alt tip veya Kalıtım Tabanlı Çok Biçimlilik ve Arayüz Tabanlı Çok Biçimlilik arasında çok fazla fark olduğuna inanıyorum . Çünkü türler arası Kalıtım temelli polimorfizmde "Is-a" ilişkisi vardır ancak Arayüz temelli polimorfizmde böyle bir şey yoktur. Aslında, farklı uygulamalarla aynı davranış çeşitli farklı Türler (Sınıflar) arasında paylaşılabilir
siamak

Kafamın karıştığını itiraf etmeliyim - üst kasaya biraz balistik yaklaşımınız bir yana, arayüz tabanlı polimorfizm dediğiniz şeyle ilgili tanımınız, alt tip polimorfizmi tanımımla tamamen aynı görünüyor. Eminim bir fark görüyorsunuz, ama korkarım bu benim için gerçekten net değil.
Nicolas Rinaudo

Gördüğünüz gibi araba ile kuş ve insan arasında bir ilişki yok ama kendi yollarında hareket edebiliyorlar. Soyut sınıf ve Arayüz arasında muazzam bir fark vardır ve arayüz kullanımı alt tipleme ile aynı değildir, bu yüzden bence kalıtım polimorfizmi ve arayüz tabanlı polimorfizm aynı şeyler değildir ve eşit değildir. // zor, yorum segmentinde kodlama //
siamak

6

Görünüşe göre en iyi tanımlar burada sağlanmıştır, bu yüzden iki sentimi eklememe izin verin sadece diğer gözlemciler için . Umarım daha fazla yardımcı olabilir.

İki tür polimorfizm vardır:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Bu basitçe yöntem aşırı yüklemesi ve operatör aşırı yüklemesidir

2.  Run time or (dynamic) polymorphism.

İlk dönem , Java ve C ++ terminolojisinden miras alınmıştır.

Ama içinde .NET terminoloji sadece ikincisi ( Acımasız çalışma süresi polimorfizmi ) gerçekten polimorfizm olarak varsayılır ve basitçe denilen polimorfizmi .

Ve bildiğim kadarıyla polimorfizmi ( çalışma zamanı ) uygulamak için üç yöntem var .

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Arayüz tabanlı çok biçimliliğin basit bir örneği:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Çıktı:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

Hala yarattığın farkı göremiyorum. Kişi, Kuş ve Araba, Imobile'ın alt türleridir. Kişi Hareketsizdir, Kuş Hareketsizdir ve Araba Hareketsizdir. Imobile türünde bir değişkene ihtiyacınız olsaydı, Kişi, Kuş veya Araba örneğini kullanabilirsiniz, tümü check yazacaktır. Bu tam olarak alt tip polimorfizmin ne anlama geldiğidir.
Nicolas Rinaudo

Kuş ve Kişi ve Araba, Imobile'ın alt tipleri değildir, bu Arayüzün Uygulayıcılarıdır ve bu Arayüzü kendi yöntemleriyle "Fark edin", "Alt tip" terimi yaygın olarak gerçek bir Tip ile ondan miras alınan gerçek bir alt tip arasında kullanılır, ve bu durumda aralarında bir "Is-a" ilişkisi vardır, örneğin bir köpek, bir memelinin alt tipidir.
siamak

derleyicinin bakış açısından bir arayüze gönderme yapmak ve referansları kullanmak doğru ve doğrudur. / AMA / BT, miras ilişkisinde alt tipleme ile eşit bir kavram değildir. Ve bir arayüzün Uygulayıcılarını alt tipler olarak adlandırmanın çok garip olduğunu ve gerçekten doğru olmadığını düşünüyorum.
siamak

Kalıtım temelli bir polimorfizm örneği, bu cevabı açıklamak için iyi olur.
Marcelo Mason

5

Polimorfizm, birkaç farklı temel öğenin (genellikle veriler, ancak her zaman nitelendirme) hepsinin çalışma zamanında aynı görünmelerine ve aynı şekilde davranmalarına izin veren ortak bir arabirimi paylaştığı bir yazılım kodlama soyutlamasıdır. Bunu, mutlak minimum uygulama ile çok çeşitli benzer, ancak aynı örneklerde tutarlı davranışı zorlamak için bir geliştirme tekniği olarak kullanırız, böylece hatalar ve tutarsızlıklar beklentisini azaltır.

Paul.


5

polimorfizm == birden çok sınıf + aynı yöntem imzaları + sınıfa özgü davranış.


2

Tek bir nesnenin çoklu biçimlerine Polimorfizm denir.



2

Polimorfizm, bir nesnenin aynı çağrı için farklı görünme ve farklı davranma yeteneğidir. ör: her hayvan farklı görünür ve ses çıkarır (ona vurduğunuzda :)


2

Polimorfizm, bir nesnenin süper tipinin bir örneği olarak değerlendirilmesine izin veren programlama dillerinin bir özelliğidir.


Olumsuz oy veren - Lütfen nedenini açıklar mısınız?
TarkaDaal

1

Farklı türlerdeki bir dizi benzer işlemlere tek bir isim vermek. İyi yapıldığında, analoji açıktır, örneğin sayıları aritmetik olarak "eklemek" ve dizileri birleştirme yoluyla "eklemek" (uzunluklarını toplar).


1

Her zaman takip ettiğim tanım bu:

Her ikisi de aynı mesajlara aynı semantikle yanıt veriyorsa, iki nesne aralarında polimorfiktir (belirli bir protokole göre).

Polimorfizm mesajlarla ilgilidir, aynı mesaj setine aynı anlamsallıkla cevap verebilmekle ilgilidir.

İki nesne boşa yanıt verebilir mi? ama mesajın anlamı farklı, o zaman .. polimorfik değiller.


1

Alt seviyedeki polimorfizm, arayüz örneğinden bir arayüzün uygulayıcıları tarafından tanımlanan yöntemleri çağırma yeteneğidir.


1

Polimorfizm, bir nesnenin birçok türe ('şekil') sahip olmasına izin veren ve diğer türlerini bilmeden veya önemsemeden ne yapmanız gerektiğine bağlı olarak onu bu türlerden herhangi biri olarak ele almanıza izin veren bir programlama özelliğidir.


1

Polimorfizm, yüksek seviyeli algoritmik kodun birden fazla veri türü üzerinde değişmeden çalışmasına izin veren dil işlevselliğidir. Ve diğer cümle, her neyse ... ;-P.

(C ++ 'ın desteklediği türler, cevabımda listelenir ve karşılaştırılır: c ++' da çok biçimlilik )


0

Polimorfizm kavramı son zamanlarda bir fenomen haline geldi. İşte gerçek sürüklenme. Çalışma zamanı, hangi alt yöntemin bir süper sınıf başvurusu tarafından çağrılması gerektiğini tanımlar. Şimdi, pratikte ne anlama geliyor? Aslında hiçbir şey ifade etmiyor. Çok biçimlilik olmadan basitçe kodlayabilirsiniz. Peki neden? Çünkü, polimorfizme sahip değilsek, tüm alt sınıf fonksiyon tanımlarını ezberlememiz gerekiyordu. Çok biçimlilik bizi pratikte bundan kurtarır.

Aşağıdaki gibi bir liste tanımlayabilirsiniz:

List list = new List();

ancak kontrol IListederseniz, arayüzden şu şekilde yararlanabilirsiniz:

IList list = new List();

ve IListreferansı özgürce kullanın . IListBaşka bir sınıfta da uygulandığını varsayarsak , bu bilinmeyen sınıfın yöntemlerini tekrar kullanabilirsiniz.IList o sınıf adını hatırlamaya çalışmadan referans . Harika, değil mi?

Şimdi, daha değerli bilgiler geliyor:
Java varsayılan olarak polimorfiktir, oysa .NET ve C ++ değildir, MS'de temel işlevi virtual(ve .NET overrideanahtar kelimesinde) bildirmeniz gerekir .

Ayrıca, polimorfizmde 2 integral kural vardır. Biri kalıtımdır (arayüz uygulaması yoluyla veya sınıf genişletme yoluyla) ve diğeri geçersiz kılmaktadır. Geçersiz kılma olmadan, polimorfizm var olmaz. Yöntem aşırı yüklemesinin (her zaman tek bir sınıfta) aynı zamanda bir tür "minimalist" polimorfizm olduğunu unutmayın.


1
Bu 2'den fazla cümle.
Dangerous

0

Belirli bir yöntem imzası için, farklı, hiyerarşik olarak ilişkili sınıflar için farklı yöntem uygulamaları çalıştırılır.


0

Polimorfizm, ortak bir arabirimi uygulayan (veya ortak bir temel sınıfı genişleten) farklı sınıfları, şimdi özel uygulamaya gerek kalmadan ve yalnızca ortak arabirimde bulunan yöntemleri kullanarak ortak bir şekilde kullanma yeteneğidir.

Yani: Java'da, ArrayList ve LinkedList'in her ikisi de List uygular, bir değişkeni List olarak bildirirseniz, değişkeniniz ArrayList veya LinkedList olarak örneklenmiş olsanız da List'de izin verilen işlemleri her zaman gerçekleştirebilirsiniz.


0

Aynı türden varlıklar (yani, aynı arabirim uygulanmış veya aynı sınıftan türetilmiş) farklı şekillerde davranır (aynı yöntem adı altında).


0

Bence farklı sınıflarda aynı imzaya sahip yöntemlerin uygulanmasının (uzantılar veya uygulamalar kullanarak bir tür kalıtım ilişkisine sahip olmak) yöntemi geçersiz kılması ve aynı zamanda polimorfizm olduğunu düşünüyorum çünkü bu şekilde aynı yöntem imzasının birçok formunu elde ediyoruz.


-2

Sanırım bazen nesneler dinamik olarak adlandırılır. Nesnenin klasik şekilli bir çokluda üçgen, kare vb. Olup olmadığından emin değilsiniz. misal.

Yani, tüm bu tür şeyleri geride bırakmak için, türetilmiş sınıfın işlevini çağırıyoruz ve dinamik sınıflardan birinin çağrılacağını varsayıyoruz.

Kare, üçgen veya dikdörtgen olması umrunda değil. Sadece bölgeyi önemsiyorsun. Bu nedenle getArea yöntemi, geçirilen dinamik nesneye bağlı olarak çağrılacaktır.


-2

Çok biçimlilik, bir işlevin farklı veri türlerinin giriş verilerini kabul etmek için otomatik olarak uyarlanma yeteneğidir. '1.1' ve '2.2' iki çift 'ekleyebilir ve' 3.3 'veya' Add 'iki dize "Stack" ve "Overflow" ve "StackOverflow" elde edebilirsiniz.


Neden birisi bunu not etti - bu National Instrument'ın polimorfizm hakkındaki web sayfasındaki 'gerçek cevap' !!!
J-Dizzle

-3

Çok biçimlilik, farklı nesnelerin aynı yönteme farklı bir şekilde yanıt vermesidir. Örneğin, bir kişi yolda yürürken bir araba yolda hareket eder. Bunlar, aynı yola farklı şekilde tepki veren iki nesnedir.


Aslında, çok biçimlilik, farklı sınıfların örneklerini ortak bir tür olarak görmektedir ve bu ortak türde bildirilen yöntemleri, farklı sınıfların bu yöntemleri nasıl uyguladığından bağımsız olarak kullanabilmiştir.
GaRRaPeTa
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.