Kotlinde Sınıflar(Classes)-2

INTERFACES

İsmail Talha DENGİZ
4 min readMay 9, 2020

--

Nesne yönelimli programlamanın temellerinden biri de interfacelerdir. İnterface, bir veya daha fazla classın ortak özelliklerinin tanımlandığı, becerilerinin tutulduğu bir yapıdır diyebiliriz. interface keywordu ile tanımlanır.

Özünde bir class değildir. Bu yüzden init bloğu ve constructorları bulunmaz. Yine class olmamasından dolayı extend değil implement edilirler. Bu implement işlemi Javada implement keywordu ile yapılırken, Kotlinde : ile yapılır. Extend işlemi de : ile yapıldığından implement ve extend işlemi constuctor parantezlerinden ayırt edilebilir. Bir class birden fazla classtan extend edemezken, bir class birden fazla interfaceden implement edebilir.

Bir class ve içerisindeki methodlar open olduğunda miras alan class içerisinde bu methodlar override edilebiliyordu ama override edilme zorunluluğu yoktu. Fakat bir class bir interfaceden implement ettiğinde eğer interface içerisindeki fonksiyonun bir kod bloğu bulunmuyorsa o fonksiyonu override etmek zorunlu, bulunuyorsa isteğe bağlıdır ve super çağrımı kullanılabilir. Kod bloğu bulunan fonksiyonu override etmesek bile implement işleminden dolayı o fonksiyona erişilebilir. Şimdi bunları kod üzerinde görelim:

Aynı isime, parametre sayısına ve tipine sahip fonksiyon hem interfacede hem de extend edilen classta varsa ve interfacedeki fonksiyon kod bloğuna sahip değilse override etme zorunluluğu ortadan kalkar. Fakat interfacedeki fonksiyon kod bloğuna sahipse super çağrımından sonra interfacedeki fonksiyonun mu yoksa classtaki methodun mu çağrımının yapıldığı belirtilmelidir.

ABSTRACT CLASS

Interfacelerin yapabildiği her şeyi yapabilirler. Ortak özellikler, beceriler değil de tüm detayların belirtileceği durumlarda kullanılır. Interfacelerden farklı olarak state tutabilirler.

Class olmalarından dolayı, constructor tanımlanabilir ve primary constructor için init bloğuna sahiptir, başka bir class tarafından extend edilirler.

  • Bir class, abstract bir classtan extend edildiğinde abstract classın tüm yapılarına sahip olmuş olur.
  • Abstract class içerisindeki abstract bir değişkene default değer atamaya izin verilmez. Bu sebepten extend eden classta bu değişken override edilmek zorundadır.
  • Abstract keywordune sahip olmayan değişkenleri override edebilmek için ise o değişken open keywordüne sahip olmalıdır.
  • Abstract keywordüne sahip methodun bodysi olamaz. Override edilmesi zorunlu hale gelir.
  • Abstract classın nesnesi ne kendi içerisinde ne de main fonksiyonu içerisinde oluşturulamaz.

DATA CLASS

Veritabanına veri göndermek, veri çekmek kısaca veri saklamak için kullanılan özelleştirilmiş classlardır. data keywordu ile bir class oluşturulur fakat diğer classlardan farklı olarak val-var keywordü ile tanımlanmış en az 1 parametresi bulunan primary constructora sahip olması zorunludur. Bu parametrelere default değer ataması yapılabilir. Data class tanımında open, abstract, sealed, inner gibi keywordler kullanılamaz. Bu sebepten dolayı data classtan miras(extend) alınamaz ama data class başka bir classtan miras alabilir, interface implement edilebilir.

Data classlar için copy(), toString(), equals(), hashCode() fonksiyonları özelleştirilmiştir ve bu fonksiyonları data classın primary constructorı içindeki değerler için kullanabiliriz, üye değişkenlerinde kullanılmaz.

Data classların bir diğer özelliği ise, bir fonksiyonun değerinin iki, üç değişkene birden atanabilir olmasını sağlar. Bu işleme Destructuring Declaration (compenentN function()) denir. (Döngüler konusunda, for döngüsünde withIndex ile kullanmıştık.)

Class tanımlamak yerine yine data saklamak için Pair ve Triple classları kullanılabilir.

ENUM CLASS

Özünde type olarak kullanılabilen, sınırlı sayıdaki verilerin gruplanmak istenmesi durumunda kullanılır. Class keywordünden önce enum(enumeration) keywordü kullanılarak tanımlanır. Constructorı bulunabilir. Nesnesini oluşturmadan class ismiyle içerisindeki değerlere ulaşılır.

Enum class içerisindeki değerlerin string haline name ile index değerlerine ise ordinal ile ulaşılabilir.

String halinin enum classta yazılmış halinden farklı dönmesini istiyorsak toString methodunu override ederek gelmesini istediğimiz değeri yazabiliriz.

Enum classlar içerisine abstract methodlar yazılabilir, bu durumda her bir enum değeri için bu method override edilmelidir. toString methodu classın default methodu olduğu için her birine override edilme zorunluluğu yoktur.

Constructor tanımlanabilir demiştik. Eğer constructor tanımlarsak her bir enum değerinin yanına constructor parantezleri açılarak içerisine değeri verilir.

Data classta olduğu gibi enum classlarda open, sealed, inner, abstract gibi keywordleri alamazlar. Başka bir classtan miras alamazlar ama interfaceden implement edebilirler. Bir interface implement edildiğinde override zorunlu olan methodlar override edilmelidir. Eğer enum class içerisine birden fazla abstract method yazmamız gerekiyorsa veya birden fazla enum class aynı methodlara ihtiyaç duyuyorsa her birine bu methodları yazmak yerine interface implement edilerek methodları override edilebilir.

SEALED CLASS

Enum classlarının özelleştirilmiş halidir. Sınırlandırılmış bir class hiyerarşisi sunar. sealed keywordu ile başlar. İçerisindeki classlar sealed classtan extend ederler. Sealed classın kendisinden nesne oluşturulamaz ama içerisindeki classların nesnesi oluşturulabilir.

Enum classlara yapısal olarak bakıldığında String, Int, Boolean gibi değerler için kullanılır. Sealed classlar ise classların içerisinde enum kullanımı yapılabilmesini sağlar.

NESTED-INNER CLASS

Class içinde bir sınıf daha tanımlanmasına nested class denir. Nesnesi, outer classın ismi.nested class şeklinde oluşturulur. Outer classın property veya methodlarına erişmek istiyorsak nested classın önüne inner keywordü yazılır. Bu kullanıma da inner class ismi verilir. Inner classın nesnesi de outer classın nesnesi.inner class şeklinde oluşturulur.

Javada olduğu gibi Kotlinde de multiple inheritance yapılamaz fakat inner classlarda performans açısından kötü olmakla beraber bunu yapabiliriz. Aşağıdaki örnekte outer class bir classtan, inner class ise başka bir classtan miras aldı fakat inner class içerisinde hem inner classın miras aldığı classın property ve methodlarına hem de outer classın miras aldığı classın propertysine ulaşabildik. Çünkü inner class outer classın property ve methodlarına erişebiliyordu. Dolayısıyla outer classın miras aldığı classında property ve methodlarına erişebilir hale geldi.

Böylelikle sınıflar konusunun da sonuna gelmiş olduk. İyi çalışmalar. :)

--

--