Kişisel web sayfamda yazılım, teknoloji ve genel hayat hakkında paylaşımlar yapmayı hedefliyorum.

Kotlin ile Programlama Dersleri – Sınıflar (Classes) – Inheritance – Interface

Kotlin ile Programlama Dersleri serisinin bu yazısında sınıflara (Class) değineceğim. Kotlin tarafını detaylandırmadan önce biraz programlama çerçevesinden sınıflara bakmak istiyorum.

Sınıf Nedir?

Bir kod yazarken birbiri ile ilişkili nitelik ve özellikleri tek çatı altında toplamak hem programlama mantığı açısından hem de yeniden kullanılabilirlik açısından doğru bir yaklaşım olacaktır. Nesneye Yönelik Programlama (OOP) felsefesinde birbiri ile ilişkili ve aynı özellikleri barındıran gerçek dünya nesnelerinin taslak haline getirildiği bu yapıya Sınıf denir. Bir sınıf üye olarak özellik(property), fonksiyon/metod (functiom/method), kurucu metodlar(constructors) bulundurabilir.

Kotlinde bir kod yazmak için bir sınıfa ihtiyacımızın olmadığı bir .kt dosyasının yeterli olduğunu daha önce söylemiştik. Aynı şekilde bir dosya içinde birden fazla sınıf da oluşturabiliriz. Kotlinde bir sınıf oluşturmak için class keywordünü ve {} parantezlerini kullanırız. Sınıf, içinde bir değer barındırmayacaksa kıvırcık parantezlere ihtiyacımız yoktur.

Kotlinde bir sınıf tanımlaması ve instance (örnek) oluşturulması aşağıdaki gibidir.

Bir sınıftan instance alabilmemiz için onun kurucu metodu (constructor) public olmalıdır. Kotlinde biz belirtmediğimiz sürece bir sınıfın constructor metodu publictir. Eğer birden farklı şekilde sınıf oluşturmak istersek burda devreye secondary constructor yapısı ortaya çıkıyor. Secondary constructor yazmaktaki tek koşulumuz primary constructorın kullanılıyor olmasıdır. Eğer sınıf ilk oluşturulurken yapılmasını istediğimiz işler varsa bunu da init bloğu içinde yazmalıyız. Çünkü primary constructor içinde kod blokları bulunduramıyoruz. Bu da primary constructor ve secondary constructor arasındaki en temel farktır.

Bir sınıftan instance alırken çalışma sırasına bakacak olursak:

  • (varsa) property initialize kodları
  • primary constructor
  • init block
  • secondary constructor block

Kotlinde bir sınıfın özelliklerini constructor içinde tanımlayabilir, default değer verebiliriz. Default parameterler ile contructor overloading işlemini kolayca gerçekleştirebiliriz.

Kotlinde sınıflarda yukarıda görülen üç metod bulunur:

  • equals: bir diğer nesne ile eşitlik kontrolü yapar.
  • hashcode: her nesneye özel bulunan kodu döner.
  • toString: Sınıf içindeki özellikleri almak için kullanılır.

Peki bu üç metod nasıl oluyor da her sınıfta bulunuyor? Her sınıfa tek tek yazılmış mı?

Cevap: Inheritance

Inheritance

Object Oriented Programming felsefesinde bir sınıfın başka sınıftan miras almasına inheritance denir. Örneğin bir Item adlı sınıfımız olsun bu sınıfın adı, yüksekliği ve genişliği olsun. Bunun yanında ClickableItem adlı başka sınıfımız olsun. Bu sınıfında yine adı, yüksekliği, genişliği olsun fakat ek olarak tıklanma durumu ve tıklandığında ne yapacağını belirten metodu olsun. Bu durumda aynı kodları tekrar tekrar yazmamak için Inheritance yani kalıtım kullanılır. Kotlinde bir sınıftan kalıtım almak için sınıflar arasına “:” işareti eklenir ve constructor çağrımı “( )”. Ayrıca bir sınıfın miras verebilmesi için o sınıfa open belirteci eklenmelidir. Çünkü Kotlinde sınıflar default olarak miras alınamaz yapıdadır. (Final)

Hemen bu senaryoyu idemizde deneyelim.

Üst sınıftaki fonksiyon ve özelliklere erişmek için override keywordü kullanılır. Override aslında ezmek anlamı taşır yani gerektiği durumlarda üst sınıftan aldığımız mirası kendi sınıfımıza özel değiştirebiliriz. Örneğin toString gibi 🙂

Data Class

Kotline özel bir sınıf yapısı olan data classların temel amacı dataların modellendiği sınıflarda çokca kullanılan sınıf propertylerine özel getter – setter işlemlerini otomatik oluşturur. Aynı zamanda toString, equals, hasCode gibi standart fonksiyonları da sınıf üyelerine özel halde override eder. Gereksiz kodları ortadan kaldırır. Data Classlar bu kolaylıkların yanı sıra bir data classı başka bir data classa kopyalamak için copy ve sınıf özelliklerine initialize esnasındaki sıraya göre erişmek için componentN gibi ek özellikleri de bünyesinde barındırır.

Abstract Class

Abstract Classlar, tekrara düşen bir işi, görevi kendi bünyesinde tamamlayıp başka sınıflara devretmek için kullanılır. Kalıtım alınan sınıflardan en büyük farkı, Abstract classlardan instance alınamaz. Yani nesnesi üretilemez. Bir base yani temel sınıf oluşturup onun üzerinden işlemleri gerçekleştirmek için kullanılır.

Uzak sunucuyla çalıştığımız ve benzer işleri farklı sınıflarda tekrarladığımız bir senaryo düşünelim.

İkinci ekran görüntüsünü incelediğimizde ilkine göre daha düzenli geliştirmeye açık ve yönetilebilir bir kod görüyoruz. Abstract classlarda bir üyeyi (function, property) abstract keywordü ile tanımlarsak bu üyeyi yalnızca alt sınıflarda override ederek kurabilir, kullanabiliriz. Eğer abstract ile işaretmezsek bunları override etmemiz gerekmez.

Interfaces

Interface, OOP felsefesinde bir sözleşme niteliğindedir. Yani aynı işi yapacak sınıflar veya modüller arasında ortak dil, ortak düşüncedir. Interfaceler ortak işleri belirlemek ve bu işleri sınıflara taahhüt etmek için kullanılmasının yanı sıra; kelime anlamının da belirttiği arayüz işlevinde kullanılır. Yani farklı sınıflar arasında ortak bir dil, haberleşme sağlayıcı olabilir.

  • Kotlinde bir interface “:” işareti ile implemente edilir. Interfacelerden nesne üretilemez.
  • Interfacelerde, body parantezlerine sahip fonksiyonun override edilmesi zorunlu değildir.
  • Abstract Classlar bir state(değer) tutabilirken; Interfaceler, -normalde- bir değer taşıyamaz.
  • Bir class bir kez kalıtım alabilirken; birden fazla interface implemente edebilir.

Bu yazıda temel olarak sınıflardan bahsetmeye çalıştım. Serinin bir sonraki yazısında Enum Class, Sealed Class, Inner Class, Object ve Companion Object yapıları ile devam edeceğiz. Sağlıcakla kalın 👋

Share

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir