"Merhaba Amigo! Bugünün dersinin konusu tip dönüştürmeleri genişletmek ve daraltmak. İlkel türleri genişletmeyi ve daraltmayı uzun zaman önce öğrendiniz. Seviye 10'da. Bugün bunun referans türleri için nasıl çalıştığı hakkında konuşacağız, yani sınıf örnekleri."
Aslında, her şey oldukça basit. Bir sınıfın kalıtım zincirini hayal edin: sınıf, onun ebeveyni, ebeveynin ebeveyni vb., Object sınıfına kadar. Bir sınıf, miras aldığı sınıfın tüm üye yöntemlerini içerdiğinden , sınıfın bir örneği, türü ebeveynlerinden herhangi biri olan bir değişkene kaydedilebilir .
İşte bir örnek:
kod | Tanım |
---|---|
|
Burada üç sınıf bildirimimiz var: Animal, Cat ve Tiger. Kedi, Hayvanı miras alır. Ve Tiger, Cat'i miras alır. |
|
Bir Tiger nesnesi, türü atalarından birininki olan bir değişkene her zaman atanabilir. Tiger sınıfı için bunlar Cat, Animal ve Object'dir. |
Şimdi genişletme ve daraltma dönüşümlerine bir göz atalım.
Bir atama işlemi, kalıtım zincirinde (Object sınıfına doğru) yukarı çıkmamıza neden oluyorsa, genişleyen bir dönüşümle (yukarıya aktarma olarak da bilinir) uğraşıyoruz demektir. Zinciri aşağı doğru nesnenin türüne doğru hareket ettirirsek, bu bir daraltıcı dönüşümdür (aşağıya doğru yönlendirme olarak da bilinir).
Kalıtım zincirinde yukarı doğru hareket etmek, daha genel bir türe yol açtığı için genişleme olarak adlandırılır. Ancak bunu yaparken, kalıtım yoluyla sınıfa eklenen yöntemleri çağırma yeteneğimizi kaybederiz.
kod | Tanım |
---|---|
|
Türü daraltırken, bir tür dönüştürme operatörü kullanmanız gerekir, yani açık bir dönüştürme gerçekleştiririz.
Bu, Java makinesinin, nesnenin onu dönüştürmek istediğimiz türü gerçekten miras alıp almadığını kontrol etmesine neden olur. Bu küçük yenilik, yazım hatalarının sayısında çok yönlü bir azalma sağladı ve Java programlarının kararlılığını önemli ölçüde artırdı. |
kod | Tanım |
---|---|
|
Daha da iyisi, bir çek örneği kullanın |
|
Ve işte nedeni. Soldaki örneğe bir göz atın.
Biz (kodumuz) ne tür bir nesneyle çalıştığımızı her zaman bilemeyiz. Değişken (Animal) ile aynı türden bir nesne veya herhangi bir alt tür (Kedi, Kaplan) olabilir. doAllAction yöntemini düşünün. Geçirilen nesnenin türünden bağımsız olarak düzgün çalışır. Başka bir deyişle, her üç tür için de doğru şekilde çalışır: Hayvan, Kedi ve Kaplan. |
|
Burada üç atama işlemimiz var. Hepsi genişleyen dönüşüm örnekleridir.
Burada type cast operatörüne gerek yoktur, çünkü herhangi bir kontrol gerekli değildir. Bir nesne referansı, türü atalarından biri olan bir değişkende her zaman saklanabilir. |
"Ah, sondan ikinci örnek her şeyi netleştirdi: kontrolün neden gerekli olduğu ve neden tip dökümünün gerekli olduğu."
"Umarım öyledir. Şu gerçeğe dikkatinizi çekmek istiyorum:"
Bunların hiçbiri bir nesnenin herhangi bir şekilde değişmesine neden olmaz! Değişen tek şey , belirli bir referans değişkeninde çağrılabilecek yöntemlerin sayısıdır .
Örneğin, bir Cat değişkeni, doAnimalActions ve doCatActions yöntemlerini çağırmanıza izin verir. Bir Tiger nesnesine işaret etse bile doTigerActions yöntemi hakkında hiçbir şey bilmiyor.
"Evet, anladım. Düşündüğümden daha kolaydı."
GO TO FULL VERSION