YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Turkish subtitles

← Kalıtım Davranışı

Get Embed Code
13 Languages

Showing Revision 4 created 12/04/2015 by Fran Ontanaya.

  1. JustJava uygulamasına geri dönelim.
  2. MainActivity sınıfı içeresindeki
    DisplayMessage metotuna bir göz atalım.
  3. Her şey daha anlaşılır bir hal
    almaya başlıyor artık.
  4. Zaten orderSummaryTextView adında bir
    değişken oluşturduğumuzu biliyoruz.
  5. Bu görünümün veri
    türü de TextView'di.
  6. Bu kısmı henüz anlayamadık ama.
  7. Bir sonraki satırda, bu TextView
    öğesine bir metot çağırıyoruz.
  8. Yukarıda belirtilen aynı
    değişkeni kullanıyoruz.
  9. Yani, orderSummaryTextView.setText'i
    çağırıyoruz.
  10. Daha sonra da metot için giriş
    olarak bir string gireceğiz.
  11. Bu string mesajı, aslen
    görüntüleme mesajı metotuna
  12. bir giriş parametresi olarak geldi.
  13. Şimdi de kodun henüz
    anlamadığımız bu kısmını irdeleyelim.
  14. Görünüşe göre FindViewById
    bir metot çağrısı.
  15. Çünkü bu parantezler arasındaki giriş
    parametresi gibi gözüken kısmın önünde.
  16. Fakat ilginç olan, bu metotun sınıfın
    hiçbir yerinde tanımlanmamış olması.
  17. Bu isme iki kere tıklayıp Command+F
    tuşlarına basarsam veya
  18. Windows üzerinde iseniz Ctrl+F, o zaman
    bu dosya içinde arama yapabilirim.
  19. findViewById olan sadece
    iki sonuç görüyorum ve
  20. ikisi de benzer
    şekillerde kullanılmış.
  21. Fakat findViewById'i çağıran
    başka bir metot görmüyorum.
  22. Hazır lafı açılmışken, dana önceden
    MainActivity sınıfında
  23. setContentView'e bir çağrı görmüştük,
    fakat bu dosya içinde
  24. arama yaparsanız, o da
    MainActivity'de tanımlanmamış.
  25. Peki, bu yöntemler
    nerede tanımlanmış?
  26. MainActivity aslında
    oldukça kısa bir dosya.
  27. Sadece 90 satır uzunluğunda,
  28. ama bu sınıfta
    göründüğünden fazlası var.
  29. Kodda extends AppCompatActivity yazıyor.
  30. Bu da MainActivity'nin
    AppCompatActivity sınıfındaki
  31. bir işlevselliğin uzantısı
    olduğu anlamına geliyor.
  32. Bilgisayarınızda bir işlem çubuğu
    hareketi görürseniz, önemli değil,
  33. sadece bunun eski bir
    sürümü olduğu içindir.
  34. Kullanmanız gereken en son
    sürüm ise AppCompatActivity.
  35. Ayrıca AppCompatActivity, eski
    Android cihazlarda bize geriye dönük
  36. uyumluluk desteği de veriyor.
  37. AppCompatActivity, Android
    destek kütüphanesinin bir parçası.
  38. Hala eski Android cihazlar üzerinde
    çalışırken Android üzerindeki en son
  39. kullanıcı arabirimini
    kullanmamıza olanak sağlıyor.
  40. AppCompatActivity
    sınıfını genişleterek,
  41. bedavaya MainActivity
    içinden bütün işlevselliğe,
  42. bütün durum
    ve metotlara ulaşabiliyoruz.
  43. Buradan herhangi bir kodu
    kopyalayıp yapıştırmamıza gerek yok.
  44. Sadece sınıfı genişletmemiz yeterli.
  45. Eğer ilgileniyorsanız,
  46. AppCompatActivity'i Google'da arayarak
    daha fazla bilgiye ulaşabilirsiniz.
  47. İşte AppCompatActivity sınıfı
    için bir referans belgesi.
  48. Chrome uzantısı bende yüklü olduğundan
  49. kaynağı da görebiliyorum.
  50. Ve bu da AppCompatActivity
    sınıfının tanımlandığı yer.
  51. Burada bir çok işlevsellik
    olduğunu görebilirsiniz, fakat
  52. kilit mesaj, nasıl uygulandığını
    anlamak zorunda değilsiniz.
  53. Tek bilmeniz gereken,
    AppCompatActivity'i genişlettiğinizde
  54. bütün bu işlevselliklere
    bedavaya sahip olacak olmanız.
  55. Yüksek seviyede şu
    şekilde görselleştirebilirsiniz.
  56. Bu, MainActivity için bir sınıf tanımı.
  57. Ve diyelim ki, burada
    tanımlanmış bazı metotlarınız var.
  58. AppCompatActivity'i genişlettiğiniz
    zaman, AppCompatActivity'den
  59. durum ve metotlara ulaşabilirsiniz.
  60. MainActivity sınıfına fiziksel
    olarak eklenmiş değiller tabii ki, fakat
  61. orada olduklarını düşünebilirsiniz,
  62. çünkü hala duruma ve
    metotlara gönderim yapabilirsiniz.
  63. İşte kodumuz da setContentView veya
    findViewById tarzı şeylere böyle
  64. gönderim yapabiliyor.
  65. O metotları devraldığımız için
    MainActivity içinde tanımlamadık.
  66. MainActivity cihaz üzerinde bir ekran
    olarak gösteriliyor, fakat
  67. MainActivity için o kodu
    biz yazmadık, devraldık.
  68. Durum ve metotlara direkt sınıf içindeki
    AppCompatActivity'den sahip değiliz,
  69. fakat artık orada olduklarını ve onlara
    gönderim yapabileceğimizi biliyoruz.
  70. Devralmaktan konu açılmışken, bunun
    hem iyi hem de kötü yanları var.
  71. Bazen bir davranışı
    devralmak isteriz fakat
  72. diğer zamanlarda biraz da
    olsa değiştirmek isteyebiliriz.
  73. Bu devralınmış sınıftan bazı
    davranışları değiştirmek isterseniz
  74. belirli metotları
    geçersiz kılabilirsiniz.
  75. Bu @override metnini metotun üzerine
    ekleyebilirsiniz, böylece bilgisayar
  76. AppCompatActivity'nin o sürümünü
    istemediğinizi
  77. fakat onun yerine buradaki tanımladığınız
    sürümü istediğinizi bilecektir.
  78. Bu zor bir konu ve çok
    fazla pratik gerektiriyor.
  79. Fakat AppCompatActivity
    sınıfından bir metotu
  80. geçersiz kılmayla ilgili
    bir örnek gördük.
  81. Ve bu metot da onCreate metotu.
  82. MainActivity içindeki onCreate metotunu
    geçersiz kılarak, o metotu çağırdığımızda
  83. ne yapılması gerektiğini söyleyen kendi
    uyarlamamızı tanımlamış oluyoruz.
  84. Bu kısmı tam anlayamadıysanız
    endişelenmeyin.
  85. Size sadece, bir kaç tane nesne yönelimli
    programlama kavramlarıyla ilgili
  86. özet bilgiler veriyorum.
  87. Aklınızda hala cevap bekleyen
    sorular olması oldukça normal.
  88. Ve hala bu konuları tamamen
    anlamak için daha fazla
  89. okumanız gerektiği.
  90. MainActivity ile AppCompatActivity
    sınıfları arasındaki ilişkiyi
  91. görselleştirmenin bir diğer yolu da
    sınıf hiyerarşi şeması çizmek.
  92. Bu, görünüm hiyerarşi şeması
    çizmekten farklı, çünkü
  93. görünüm hiyerarşi şeması ekranda
    görüntülenen görünümleri gösterir.
  94. Sınıf hiyerarşi şeması
    ise farklı Java sınıfları
  95. arasındaki ilişkiyi gösterir.
  96. Üst sınıf olarak elimizde
    AppCompatActivity var.
  97. MainActivity, AppCompatActivity'den
    genişlediği için
  98. alt sınıf olarak tanımlanıyor.
  99. Bu sınıf tanımını ne zaman görürseniz,
    genişlettiğiniz her ne ise o
  100. üst sınıf olarak tanımlanır.
  101. Bu da alt sınıf olacaktır.
  102. Yani, DetailActivity adında başka
    bir etkinlik oluşturursanız ve
  103. AppCompatActivity'i genişletmişseniz,
    bu alt sınıf olur
  104. ve bu da üst sınıf.
  105. Java sınıf devralmasıyla
    ilgili işte bir örnek daha.
  106. Şöyle bir düşündüğünüzde,
    TextView, ImageView
  107. ve ButtonView'in hepsinin
    ortak yanları var.
  108. Bütün bu görünümlerin ekranda
    bir eni ve boyu mevcut.
  109. Bu kısmı henüz öğrenmedik ancak
    bir de görünebilirlik durumları var.
  110. Yani hepsi görünmez veya
    görünür hale getirilebilir.
  111. Hepsi için ortak olan
    başka özellikleri de var.
  112. TextView sınıfı içinde bunlar
    için kod yazıp ImageView ve
  113. Button sınıfı üzerine
    kopyalamak yerine
  114. daha zekice bir şey yapabiliriz.
  115. Bir View (görünüm) sınıfı oluşturabiliriz.
  116. Bu üç görünüm için ortak olan özellikleri
    çıkartabiliriz ve sonra da bu View
  117. sınıfının içine yerleştirebiliriz, böylece
    kodu bir kez yazmamız yeterli olacaktır.
  118. Fakat, sonra TextView sınıfı ile
    View sınıfı arasında nasıl
  119. bağ kuracağız?
  120. Eğer devralmayı düşünüyorsanız,
    doğru bildiniz.
  121. TextView java dosyasında
    TextView sınıfını tanımlayacağız.
  122. Bu sayede bütün bu verileri ve metotları
    View sınıfından alabileceğiz.
  123. Sonra TextView sınıfında bu kadar
    çok kod olmasına gerek kalmayacak,
  124. çünkü işlevselliğin bir kısmı
    zaten View sınıfında yazılı durumda.
  125. Aynı şey ImageView ve
    Button sınıfları için de geçerli,
  126. bu kadar kod yazmak
    zorunda değiliz.
  127. Bu dosyalarda, sadece
    View sınıfı ile ImageView
  128. arasındaki farklı olan
    şeyleri yazmamız yeterli.
  129. Ben bunu bir aralık belirleme olarak
    görüyorum. Yani ImageView sınıfı,
  130. View sınıfı ile karşılaştırıldığında,
    sadece farklı olan şeyleri tanımlamalı.
  131. Eğer ki View sınıfından bazı belli
    davranışları devralmak istemiyorsak,
  132. ImageView sınıfındaki ya da diğer
    sınıflardaki güncellenmiş davranışları
  133. belirtebiliriz.
  134. Bu noktada, terminolojiyi
    size hatırlatmak adına;
  135. TextView alt sınıf oluyor
    ve View de üst sınıf.
  136. Tekrardan, TextView sınıfı için
    belgelendirmeye döndüğümüzde
  137. artık bu kısmı
    anlayabilecek durumdayız.
  138. TextView için View'i
    genişlettiği yazıyor.
  139. Bunun, View sınıfından metot
    ve durum devraldığımız
  140. anlamına geldiğini artık biliyoruz.
  141. Ve burada da sınıf
    hiyerarşi şeması var.
  142. TextView sınıfının View
    sınıfından devraldığını gösteriyor.
  143. Ve sırayla, View sınıfı
    Object sınıfından devralıyor.
  144. Biraz incelerseniz, aslında
    TextView'den genişleyen
  145. EditText sınıfı gibi diğer
    sınıfları bulabilirsiniz.
  146. Yani, davranışı TextView
    sınıfından alıyor ve
  147. ona belirli bir işlevsellik ekliyor.
  148. Böylece EditText,
    TextView'den genişlemiş oluyor.
  149. Ve TextView de View'den genişliyor,
    ve View de Object'den genişliyor.
  150. İşte sınıf hiyerarşisi şeması da bu.
  151. Bir sürü şey var ve
    saatlerce buna bakabilirsiniz.
  152. Fakat ben size TextView belgelendirme
    sayfasında tek bir şey göstereceğim.
  153. SetVisibility için metotu
    göstermek istiyorum.
  154. İşte TextView sınıfı içinde
    SetVisibility için Java metotu bu.
  155. Görünümün görünebilir
    olup olmayacağını belirliyor.
  156. Eğer bu metota tıklarsam,
    beni View sınıfına götürür.
  157. Ve sonra da metotun
    ne işe yaradığını açıklıyor.
  158. Bu sayede bir TextView nesnesinin
    görünebilirlik metotunun olduğunu,
  159. fakat aslında View sınıfından
    devraldığını görebilirsiniz.
  160. Yani, bu işlevselliği View
    sınıfından bedavaya almışız.
  161. Pekala, bir ton yeni
    kavramı ele aldık.
  162. Normalde bu, bilgisayar bilimi
    kursunda bir döneme yayılır.
  163. Şimdi biraz alıştırma yapacağız ve
  164. umuyorum ki sizin için
    aradaki boşlukları doldurur.
  165. Fakat unutmayın ki, bu kavramları
    tamamen anlamanız çok daha
  166. fazla zamanınızı alacak ve daha çok
    pratik yapmanız gerekecek.
  167. Peki, ilk alıştırma; yeni bir Android
    uygulaması geliştirmenizi istiyorum,
  168. çünkü Just Java uygulamasını
    bozmak istemeyiz.
  169. Projeyi oluşturduktan sonra,
    uygulamayı çalıştırın.
  170. Uygulamanızı geliştirdiğiniz de,
    bir MainActivity dosyası göreceksiniz.
  171. Bu MainActivity dosyası
    AppCompatActivity'den genişleyecek.
  172. Bunun yerine, Android Studio'su
    sürümünüzde eğer MainActivity,
  173. ActionBarActivity'den
    genişliyorsa, o da olur.
  174. Zaten AppCompatActivity'nin
    sadece eski bir sürümü.
  175. Bu geçersiz kılma metotunu
    kaldırarak, onCreate metotunun
  176. AppCompatActivity'de göründüğü
    haline dönmüş olacağız.
  177. Bu metotun olması MainActivity'de onCreate
    için farklı bir davranış istediğimiz
  178. anlamına geliyor.
  179. Yani, onu kaldırmak bizi
    AppCompatActivity sınıfındaki
  180. orijinal davranışa geri döndürecek.
  181. Uygulamayı çalıştırdığınızda,
  182. ilk seferki çalıştırmanızdan
    farklı bir şeyler fark ettiniz mi?
  183. Cevabınızı bu metin kutusuna yazın.