Genellikle, derleyicinin bir şeyin türü hakkında sahip olduğu statik olarak bilinen bilgi, bildiğinizden (veya en azından umarım) daha az spesifik olduğunda, küçümseme yapmaktır.
Örneğiniz gibi durumlarda, nesne bir olarak yaratıldı Apple
ve daha sonra bu bilgi, referansı bir değişken türünde saklayarak atıldı Fruit
. Sonra Apple
tekrar aynı referansı kullanmak istersiniz .
Bilgiler yalnızca "yerel olarak" atıldığından, derleyici , bildirilen türü olmasına rağmen parent
gerçekten bir olan bilgiyi koruyabilirdi .Apple
Fruit
Ama genellikle kimse bunu yapmaz. Bir oluşturmak Apple
ve bir olarak kullanmak istiyorsanız Apple
, bunu bir Apple
değişkende değil , bir değişkende Fruit
saklarsınız.
Eğer sahip olduğunuzda Fruit
ve bunu kullanmak istediğinizde , genellikle her türlü dönüşü sağlayabilecek bazı yollarla Apple
elde ettiğiniz Fruit
anlamına gelir , ancak bu durumda bunun bir olduğunu bilirsiniz . Hemen hemen her zaman onu inşa etmediniz, başka bir kodla geçtiniz.Fruit
Apple
Bunun bariz bir örneği, parseFruit
"elma", "portakal", "limon" vb. Gibi dizeleri uygun alt sınıfa çevirebilecek bir fonksiyonum varsa ; Genellikle bu işlevi çeşit döndürdüğünü yaklaşık biz (ve derleyici) bilebiliriz Fruit
ama ararsanız parseFruit("apple")
o zaman ben en bir arayacaktım biliyoruz Apple
ve kullanmak isteyebilirsiniz Apple
ı downcast böylece, yöntemleri.
Yine yeterince akıllı bir derleyici , burada parseFruit
sabit bir kodla çağırdığım için kaynak kodunu satır içine alarak anlayabiliyordu (başka bir modülde değilse ve Java gibi ayrı bir derlememiz yoksa). Ancak, dinamik bilgileri içeren daha karmaşık örneklerin derleyicinin doğrulaması için daha zor (hatta imkansız!) Olabileceğini kolayca görebilmelisiniz.
Gerçekçi kod downcast'leri genellikle derleyicinin downcast'in jenerik yöntemler kullanarak güvenli olduğunu doğrulayamadığı ve downcasting ile geri almaya çalıştığımız aynı tür bilgileri atarak bir upcast'i takip eden gibi basit durumlarda değil.