Polimorfizm ilgili tip nesneler, aynı tedavi edilecek sağlayarak kod yeniden kullanılmasına olanak sağlar.
Eğer farklı davranır alt sınıflara onlarca ihtiyaç duyabileceği göz önünde bulundurun:
struct Shape1: public Shape { /* .. */ }; // triangle
struct Shape2: public Shape { /* .. */ }; // rectangle
// ...
struct ShapeN: public Shape { /* .. */ }; // projection of rhombic triacontahedron
Eğer Shape
işaretçiler dizisi ile işaret nesneleri işlemek gerekebilir olduğunu düşünün. polimorfizm ile
, tek vektör gerekir ve sanal fonksiyonu ile tek bir döngü çağırır: polimorfizm olmadan
std::vector<Shape*> v = get_shape_vector();
for(Shape* s : v)
s->draw();
, her türü için ayrı dizi yönetmek olurdu ve bunları ayrı ayrı işlemek:
polimorfizm kullanarak kod
std::vector<Shape1> v1 = get_shape1_vector();
std::vector<Shape2> v2 = get_shape2_vector();
// ...
std::vector<ShapeN> vN = get_shapeN_vector();
for(Shape1& s : v1)
s.draw();
for(Shape2& s : v2)
s.draw();
// ...
for(ShapeN& s : vN)
s.draw();
3 hat polimorfizm kullanmayan kod 3 * K hatları daha sağlamanın yolu, daha kolaydır.
işlemi değiştirmeniz gerekebilir olduğunu düşünün. Belki de çizimden önce bir işlev çağrısı eklemek istersiniz.
void pre_draw(Shape*);
for(Shape* s : v) {
pre_draw(s);
s->draw();
}
polimorfizmi olmadan, düzine her fonksiyonların onlarca tanımlamak ve değiştirmek gerekir döngüler:
void pre_draw1(Shape1&);
void pre_draw2(Shape2&);
// ...
void pre_drawN(ShapeN&);
for(Shape1& s : v1) {
pre_draw1(s);
s.draw();
}
for(Shape2& s : v1) {
pre_draw2(s);
s.draw();
}
// ...
for(ShapeN& s : v1) {
pre_drawN(s);
s.draw();
}
daha sonra şekil ekleme olabileceğini göz önünde bulundurun yanınızda polimorfizm olduğunda bu basit . Polimorfizm ile, yeni türü ve sanal işlevi tanımlamanız yeterlidir. Dizine işaretçiler ekleyebilir ve bunlar diğer her uyumlu türdeki nesneler gibi işlenecektir.
struct ShapeN1: public Shape { /* .. */ }; // yet another shape
polymorhpism olmadan, yeni bir tür tanımlama yanında, bunun için yeni bir dizi oluşturmak gerekir. Ve yeni bir pre_draw
işlevi oluşturmak gerekir. Ve bunları işlemek için yeni bir döngü eklemeniz gerekir.
void pre_drawN1(ShapeN1&);
// ...
std::vector<ShapeN1> vN1 = get_shapeN1_vector();
// ...
for(ShapeN1& s : vN1) {
pre_drawN1(s);
s.draw();
}
Aslında, şekil türünün her işlenir yerlerde için tüm kod tabanı geçmesi ve orada yeni türü için kod eklemek gerekir.
Şimdi, N küçük veya büyük olabilir. Daha büyük N ise, daha fazla tekrarlanan polimorfizm önler. Ama ne olursa olsun kaç kaç alt sınıfları, bir yenisi büyük bir nimet olduğunu eklediğinizde tüm kod tabanına bakmak zorunda değil.
Durumunuzda yeni bir işaretçiye gerek yok. Ancak bu, "polimorfizm için ihtiyaç nedir?" Ile ilgili değildir. " – juanchopanza
Sanal işlevlerin noktası, çalışma zamanında davranışı tanımlayabilir ve nesnelerin dinamik kullanımını sağlar. Polimorfizm buna verilen isimdir. – Lawrence
Örneğin, şekiller koleksiyonu oluşturmak isteyebilirsiniz. Std :: vector '' seçeneğini göz önünde bulundurun. Farklı şekiller içerebilir, ancak hepsine ortak şeyler yapabilirsiniz. –
isapego