İçeriğe geç

Kitaplar / Yöntem ile Programlamaya Giriş / Bölüm 9 — Kayıtlar ve sınıflar

Bölüm 9 — Kayıtlar ve sınıflar

Gerçek dünyadaki şeylerin birden çok özelliği vardır: bir noktanın x ve y’si, bir hesabın sahibi ve bakiyesi. Kayıt bu özellikleri bir araya toplar. Sınıf ise özelliklerin yanına davranışları (metodları) da ekler.

Kayıtlar

Yöntem
program KayıtÖrneği
tip
  Nokta = kayıt
    x, y: ondalık
  bitir

fonksiyon Uzaklık(a, b: Nokta): ondalık
başla
  dön Kök((a.x - b.x) ** 2 + (a.y - b.y) ** 2)
bitir

değişken
  p, q: Nokta
başla
  p.x := 1;  p.y := 2
  q := Nokta.Oluştur(4, 6)      // alanları sırayla doldurur
  yaz('p = ' + p + ', q = ' + q, 1)
  yaz('Uzaklık: ' + Uzaklık(p, q), 1)
  q := p                        // kayıtlar KOPYALANIR
  q.x := 99
  yaz('p.x hâlâ ' + p.x, 1)
bitir.
Çıktı
p = Nokta(x: 1.0, y: 2.0), q = Nokta(x: 4.0, y: 6.0)
Uzaklık: 5.0
p.x hâlâ 1.0

Kayıt tipinde bildirilen bir değişken boş alanlarla hazır gelir; p.x := 1 hemen yazılabilir. Kayıtlar değer gibi davranır: q := p bir kopya üretir, q’yu değiştirmek p’yi etkilemez.

Sınıflar

Bir sınıf iki parçada yazılır. Önce tip bölümünde sınıfın neye sahip olduğu bildirilir. Sonra metodların gövdeleri Sınıf.Metod adıyla tanımlanır. Bu Delphi tarzıdır ve büyük sınıfları okunur tutar.

Yöntem
program BankaHesabı
tip
  Hesap = sınıf
  özel
    tutar: ondalık
  genel
    sahip: metin
    kurucu Oluştur(ad: metin; ilkPara: ondalık = 0)
    prosedür Yatır(miktar: ondalık)
    prosedür Çek(miktar: ondalık)
    fonksiyon Bakiye: ondalık
    fonksiyon MetneÇevir: metin
  bitir

kurucu Hesap.Oluştur(ad: metin; ilkPara: ondalık = 0)
başla
  sahip := ad
  tutar := ilkPara
bitir

prosedür Hesap.Yatır(miktar: ondalık)
başla
  tutar := tutar + miktar
bitir

prosedür Hesap.Çek(miktar: ondalık)
başla
  eğer miktar > tutar ise
    fırlat Hata('Yetersiz bakiye', 'BankaHatası')
  tutar := tutar - miktar
bitir

fonksiyon Hesap.Bakiye: ondalık
başla
  dön tutar
bitir

fonksiyon Hesap.MetneÇevir: metin
başla
  dön Biçimle('{} hesabı: {:.2} TL', sahip, tutar)
bitir

değişken
  h: Hesap
başla
  h := Hesap.Oluştur('EdaEce', 100)
  h.Yatır(250)
  h.Çek(80)
  yaz(h, 1)
  yaz('Bakiye: ' + h.Bakiye, 1)
  dene
    h.Çek(1000)
  yakala (hata)
    yaz(hata.tür + ': ' + hata.mesaj, 1)
  bitir
bitir.
Çıktı
EdaEce hesabı: 270.00 TL
Bakiye: 270.0
BankaHatası: Yetersiz bakiye
Kavram Açıklama
Alan Sınıfın verisi: tutar, sahip. Metodlar içinden doğrudan adıyla kullanılır.
Metod Sınıfa ait prosedür ya da fonksiyon: Yatır, Çek
kurucu Yeni nesne oluşturan özel metod. Hesap.Oluştur(...) ile çağrılır.
kendi Metodun üzerinde çalıştığı nesne. kendi.tutar = tutar
özel / genel Hangi üyelerin dışarı için olduğunu belgeler. Şimdilik bilgi amaçlıdır, erişimi engellemez.
MetneÇevir Tanımlanırsa yaz(nesne) onu kullanır

Alanlara ve metodlara aynı adı vermemek gerekir. Büyük/küçük harf fark etmediği için bakiye alanı ile Bakiye metodu aynı ad olur. Bu yüzden alana tutar dedik.

Kalıtım

Bir sınıf başka bir sınıfın özelliklerini miras alabilir ve istediği metodları değiştirebilir. Metod gövdeleri sınıfın içinde de yazılabilir; kısa sınıflar için bu daha pratiktir.

Yöntem
program Kalıtım
tip
  Hayvan = sınıf
    ad: metin
    kurucu Oluştur(a: metin)
    başla
      ad := a
    bitir
    fonksiyon Ses: metin; sanal
    başla
      dön '...'
    bitir
    fonksiyon Tanıt: metin
    başla
      dön ad + ' der ki: ' + Ses
    bitir
  bitir

  Kedi = sınıf(Hayvan)
    fonksiyon Ses: metin; ezer
    başla dön 'Miyav'; bitir
  bitir

  Köpek = sınıf(Hayvan)
    cins: metin
    kurucu Oluştur(a, c: metin)
    başla
      miras Oluştur(a)            // ebeveynin kurucusunu çağır
      cins := c
    bitir
    fonksiyon Ses: metin; ezer
    başla dön 'Hav hav'; bitir
    fonksiyon Tanıt: metin; ezer
    başla dön miras Tanıt + ' (' + cins + ')'; bitir
  bitir

değişken
  hayvanlar: liste
  h: Hayvan
başla
  hayvanlar := [Kedi.Oluştur('Tekir'), Köpek.Oluştur('Karabaş', 'Kangal'), Hayvan.Oluştur('Balık')]
  hayvanlar içindeki her h için
    yaz(h.Tanıt, 1)
  yaz('Karabaş bir Hayvan mı? ' + ÖrneğiMi(hayvanlar[1], Hayvan), 1)
  yaz('Tekir bir Köpek mi?    ' + ÖrneğiMi(hayvanlar[0], Köpek), 1)
bitir.
Çıktı
Tekir der ki: Miyav
Karabaş der ki: Hav hav (Kangal)
Balık der ki: ...
Karabaş bir Hayvan mı? doğru
Tekir bir Köpek mi?    yanlış

Buradaki en önemli fikir çok biçimliliktir. Tanıt metodu yalnızca Hayvan sınıfında yazıldı, ama içindeki Ses çağrısı nesnenin gerçek sınıfına göre “Miyav” ya da “Hav hav” oldu. miras ebeveyn sınıfın aynı adlı metodunu çağırır. sanal ve ezer sözcükleri okuyana niyeti anlatır; Yöntem’de tüm metodlar zaten sanaldır.