Objenin başka bir obje gibi davranmasından ziyade bir objenin bir den fazla formunun olması demek daha doğru olur. SOLID prensiplerinde open-closed ile güzel uyuşuyor. Genel olarak verilen bir örnek üzerinden gidecek olursak bir Shape (Şekil) classımız olsun, bu shape birden fazla formda olabilir: kare, daire, üçgen vs. Shape classında alan hesabı yapmak istersek her bir şekil için type belirtip eğer o type ise o şekil için alan hesabı yaptırabiliriz. if type=="square" a*a else if type=="üçgen a*h/2. Fakat bu tarz bir yola girmek hem gereksiz bir if else (ya da switch) bloğu yaratıyor. Ve ne zaman yeni bir type eklersek şekil classına, onun için classı "modify" etmemiz gerekiyor. Bunun yerine her bir şekil için ayrı class yaparsak shape classından inherit eden. Her class da alan hesaplayan methodu o class a özel yazabiliriz. Yeni bir şekil eklencek olursa, onun için ayrı bir class oluşturup kolay bir şekilde "extend" etmiş oluruz.
Diğer bir güzel yanı da: elinde bir shape objesi varsa ve onun alanına ihtiyacın varsa, shape.getArea() demen yeterli. Onun hangi typeda olduğu seni çok da ilgilendirmiyor oluşu.
class Shape {
float getArea();
}
class Square extends Shape{
float getArea(){
// hesaplama
}
}
class Circle extends Shape{
float getArea(){
// hesaplama
}
}
main:
Shape square = Square()
Shape circle = Circle()
square.getArea()
circle.getArea()
Kaynaklar
- Refactoring Guru. Replace Conditional With Polymorphism. (17 Ekim 2020). Alındığı Tarih: 17 Ekim 2020. Alındığı Yer: | Arşiv Bağlantısı