Solidity abstract, interface ve virtual keywordleri
Solidity dilinde virtual, abstract ve interface keywordlerini bu yazımda ele alacağım. abstract ve interface keywordlerine daha önceki yazım özelinde yüzeysel olarak değinmiştim. Hadi gelin bu keywordleri birlikte biraz daha detaylı olarak inceleyelim.

abstract
abstract keywordü kullanımı esnasında dikkat edilmesi gereken hususlar şunlardır.
- Ortak olan bir özelliğin, kullanıldığı kontrata göre farklılık gösterdiği durumlarda kullanılır. Örneğin arabalar için elzem olan motorunun tipini döndüren MotorTipi isminde bir metodla aracın dizel mi yoksa benzinli mi olduğu bilgisini almak istediğimizi varsayalım. Bir adet Arac isimli bir abstract kontrat yazalım ve bu kontratı miras alan BenzinliArac ve DizelArac isimli 2 adet kontratımız olsun. Bu kontratlar Arac isimli kontrata ait MotorTipi metodunu implemente ettiklerinde BenzinliArac kontratından dönen değer “Benzinli” , DizelArac isimli kontrattan dönecek olan değer ise “Dizel” olacaktır.
- Değişkenlik gösterecek ama aynı isimde tanımlamamız gereken fonksiyonaliteler için abstract keywordünü kullandığımız kontratta o fonksiyonunun içerisi boş bırakılmalıdır.
- Solidity 0.6.0 versiyonu ile gelmektedir. Bu versiyonun altındaki versiyonlarda kullanılamaz.
- abstract keywordüne sahip kontrat deploy edilmez, onun yerine bu kontrattan türetilmiş olan kontratla birlikte deploy edilir.
- Kontratlardan bir farkı olmadığından dolayı bir adet constructor metoduna sahip olması gerekmektedir.
- abstract olarak işaretlenen kontrat, başka bir kontrattan kalıtım yoluyla miras alabilir.
interface
interface keywordünü geliştirmelerimiz esnasında ortak bir yapı hedeflediğimizde kullanırız. Bu ortak yapılara en iyi örnek EIPs-ERCs verilebilir. Günlük hayatta al-sat işlemleri esnasında bu EIPs standartlarını kullanmaktayız. Bu standartlara örnek olarak Tokenlar(ERC20, ERC721, ERC1155) verilebilir.
interface keywordü kullanımı esnasında dikkat edilmesi gereken hususlar şunlardır.
- Fonksiyonların erişim belirleyicilerinin external olarak işaretlenmiş olması gerekir.
- interface kalıtım yoluyla başka bir kontrattan herhangi bir şeyi miras alamaz. Sadece interface olarak tanımlanmış olanlarla kalıtım yapılabilir.
- Herhangi bir constructor metoduna sahip değildir.
- interface keywordünü kullandığımız interface yapısını miras olarak alan kontrat bu yapıda bulunan metodların tamamını implemente etmesi gerekmektedir.
- interface keywordünü kullanırken yaptığımız tanımlama içerisinde enum ve struct gibi özelleştirilmiş veri tipi tanımlamamıza olanak veren veri tipleri de kullanılabilir.
- interface içerisinde metod overloading ile de aynı isimli metodlar kullanılabilir.
- Daha önce tanımladığımız kontratların metodlarını çağırma esnasında kontrata ait ABI’nin interfacelerini de kullanarak çağrım işlemini gerçekleştirebiliriz.
NOT: overloading, inheritance, ABI kavramlarına daha sonraki yazılarımda detaylı olarak değineceğim.
virtual
virtual keywordü Solidity 0.6.0 versiyonuyla birlikte hayatımıza giriş yapmıştır. virtual keywordü kullandığımız bir metodun bulunduğu kontratı miras alan başka bir kontrat varsa ve bu metod değiştirilmek isteniyorsa, override keywordü kullanılarak istenilen şekilde değiştirilebilir.
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
Yukarıdaki metodda hem virtual hem de override keywordleri kullanılmıştır. virtual keywordünün kullanmasının sebebi bu kontrattan miras alacak olan yeni kontrat örnekteki transfer metodunu değiştirebilmesi içindir. override keywordü ise transfer metodunun bulunduğu kontratın bir interface yapısından türetilmiş olduğunu veya başka bir kontrattan türetilerek transfer metodunu işlevselliğini değiştirmek için kullanılmış olduğunu gösterir.
override
override keywordü virtual keywordüyle birlikte hayatımıza giriş yapmıştır. Bu keyword üzerinde değişiklik yapmak istediğimiz virtual ile işaretlenmiş metodlarda kullanılır.
override keywordü kalıtım hakkındaki yazacağım yazıda daha detaylı olarak ele alınacaktır.
Solidity 0.8.8 versiyonundan itibaren override keywordünü kullanmadan da direkt olarak aynı tanımlamayla metod işlevselliği değiştirilebilir.