Serdar YILMAZ / Software Developer
Bizimkisi Bir “Bug” Hikayesi...
Akbank Bankacılık Merkezi

Arşiv 'not' Kategori

C# – Virtual Metotlar

.netKalıtım yolu ile sınıfların birbirinden türetilebileceğini ve bir sınıfın diğer bir sınıftan türediği zaman, türediği sınıfın bütün özelliklerini içereceğini “C# – Kalıtım” başlıklı içeriğimizde açıklamıştık.

Temel sınıftan türetilmiş sınıflara aktarılan metotları her zaman olduğu gibi kullanmak istemeyebiliriz. Bu metotları türetilmiş sınıf içerisinde yeniden tanımlayabilmek için virtual ve override anahtar sözcüklerini kullanırız.

Virtual metotlar kalıtım yolu ile aktarıldıkları sınıfların içerisinde override edilerek değiştirilebilirler. Eğer override edilmezlerse temel sınıf içerisinde tanımlandıkları şekilde çalışırlar.

Kod kalabalığını arttırmamak ve konuyu daha anlaşılır bir şekilde anlatmak için; sınıfları karışıklığa yer vermeyecek şekilde isimlendirip, konumuzun dışında olan kod satırlarına/bloklarına yer vermemeye çalışacağım.

Örnek bir senaryo üzerinden gidecek olursak; User (kullanıcı), Category (kategori) ve Article (Makale) isimli sınıflarımızın olduğunu ve bu sınıfların Database sınıfından türetildiğini düşünelim.

Database sınıfı içerisindeki Insert() metodu kalıtım yolu ile User, Category ve Article sınıflarına aktarılacaktır.

Yukarıdaki konsol uygulamasının ekran çıktısı;

Ancak biz User sınıfında Insert() metodunun kullanıcı adı kontrolü yaptıktan sonra veriyi kaydetmesini istiyor olabiliriz. Temel sınıf içerisindeki bir metodun gövdesini türetilmiş sınıflar içerisinde değiştirebilmek için Temel sınıf içerisindeki metodu virtual olarak tanımlamamız gerekir.

Database sınıfı içerisindeki Insert() metodu virtual olarak belirtildiği için User sınıfı içerisinde override edilerek gövdesi değiştirildi. override edilmiş bir metot içerisinden metodun orijinalini (temel sınıf içerisindeki halini) çağırabilmek için base anahtar sözcüğü kullanılır.

Konsol uygulamamızı tekrar çalıştıracak olursak ekran çıktısı aşağıdaki gibi olacaktır.

Serdar YILMAZ

C# – Arayüzler

.netArayüzler, sınıflara rehberlik etmek üzere oluşturulan nesneye dayalı programlamanın en önemli özelliklerinden biridir. Sınıfların hangi metotları ve özellikleri içermesi gerektiğini arayüzler içerisinde bildiriyoruz.

Arayüz Oluşturma

Arayüzler “interface” anahtar sözcüğü ile oluşturulur. Zorunlu olmamakla birlikte arayüz isimleri genellikle “I” harfiyle başlatılır. Böylece “I” ön ekini gören bir programcı onun bir arayüz olduğunu anlar. Arayüz içerisinde özelliklerin ve metotların sadece bildirimi yapılır. Yani herhangi bir şekilde özelliklere bir değer atanmaz sadece türleri ve isimleri yazılır, aynı şekilde metotların içerisine kodlar yazılmaz sadece geri dönüş türleri ve isimleri yazılır. 

Arayüzlerin Sınıflara İmplement Edilmesi

IKisi arayüzü, Yonetici sınıfına implement edildiği için (1.Satır) Yonetici sınıfı, IKisi arayüzünde bildirimi yapılmış olan özellikleri ve metotları içermek zorundadır. Yonetici sınıfı içerisine, IKisi arayüzünde bildirimi yapılmış metotlar ve özellikler haricinde Yonetici sınıfına has metotlar ve özellikler de tanımlanabilir. 

Arayüzlere Neden İhtiyaç Duyarız?

Arayüzlerin geniş bir kullanım alanı bulunmaktadır. Basit bir örnek üzerinden anlatacak olursak; 

Arayüz kullanımı sınıflarımızı bir standart çerçevesinde yapılandırmamızı sağlamaktadır. IKisi arayüzünün Isci ve Yonetici sınıflarına implement edildiğini gören bir programcı, bu sınıfların içerisinde adSoyad, adres, departman gibi özelliklerin olduğunu ve bu özelliklere erişilerek gerekli bilgilerin alınabileceğini bilecektir.

Örneğin, Yonetici ve Isci sınıflarından oluşturulan nesnelerin içerisindeki adSoyad özelliğini ekrana yazdıran bir metot yazalım. Arayüzlerin sağlamış olduğu kolaylıktan faydalanmıyor olsaydık bu işlemi aşağıdaki gibi yapıyor olurduk;

İki farklı metot tanımlamamız gerekirdi. Bu metotlardan biri Yonetici sınıfı türünden parametre alırken, diğeri Isci sınıfı türünden parametre alırdı. Ancak arayüzler sayesinde bu işlemi tek bir metot yazarak yapabiliriz.

IKisi arayüzü, Yonetici ve Isci sınıflarına implement edildiği için bu sınıflardan oluşturulan nesneler, IKisi arayüzü türündeki bir parametrede tutulabilir. Bu yüzden adSoyadBilgisi() metoduna parametre olarak Yonetici veya Isci sınıfından oluşturulan nesneleri gönderebiliriz. Bu parametre aracılığı ile ilgili nesnelerin sadece IKisi arayüzünden gelen özellik ve metotlarına erişebiliriz.

Çoklu İmplementasyon 

Bir sınıfa birden fazla arayüz implement edilebilir. Örnek bir senaryo üzerinden konuyu anlatacak olursak; Bir fabrika için otomasyon programı yazdığımızı düşünelim. Fabrikada 3 farklı çalışan türü olsun, bunlar yönetici, işçi ve robot. Her bir çalışanın ID, ad-soyad, adres, maaş, departman ve toplam çalışma saati bilgisi olsun. 

Eğer arayüz tasarımını yukarıdaki gibi yaparsak ICalisan arayüzünü, oluşturacağımız Yonetici ve Isci sınıflarına implement edebiliriz ancak Robot sınıfına implement edemeyiz. Çünkü robotların adlarının ve adreslerinin olmayacağını ve maaş almayacaklarını biliyoruz. Bu yüzden ICalisan arayüzünü uygun bir şekilde parçalamamız gerekiyor. 

ICalisan ve IKisi şeklinde iki arayüz oluşturduk. Yöneticiler ve işçiler hem çalışan hemde birer kişi olduğundan, bu sınıflara hem ICalisan arayüzünü hem de IKisi arayüzünü imlement edeceğiz. Robot sınıfına ise sadece ICalisan arayüzünü implement edeceğiz. 

Kurumsal Mimarilerde Arayüz Kullanımı

Daha önce kurumsal mimaride bir uygulama geliştirmediyseniz bu bölümü şimdilik atlayabilirsiniz. 

Bu başlıkta olabildiğince yalın bir şekilde arayüzlerin kurumsal mimarilerde ki kullanımına bir örnek vermeye çalışacağım. Kod kalabalığını arttırmamak ve konuyu daha anlaşılır bir şekilde anlatmak için sınıfları karışıklığa yer vermeyecek şekilde isimlendirip, konumuzun dışında olan kod satırlarına/bloklarına (veritabanı sorguları) yer vermemeye çalışacağım.

Bir projede farklı veritabanı yönetim sistemleri kullanılabilir. Projelerimizi bizden fazla veritabanı yönetim sistemine destek verecek şekilde geliştirebilmek için arayüzlerden faydalanabiliriz. 

Öncelikle IRepository adını verdiğimiz arayüzün içerisinde, veritabanı üzerinde ekleme, silme, güncelleme, kaydetme gibi temel işlemleri yapacak metotların bildirimini yapıyoruz. Sonra bu arayüzü, farklı veritabanı yönetim sistemleri üzerinde işlem yapacak olan sınıflara implement ediyoruz. 

Projemizin hem Oracle veritabanına hemde MsSQL veritabanına destek vermesini istiyorsak; IRepository arayüzü içerisinde bildirimi yapılan metotları, OracleDB sınıfında Oracle vertabanında işlem yapacak şekilde, MsSQLDB sınıfında MsSQL veritabanında işlem yapacak şekilde yazmamız gerekiyor.

MsSQLDB ve OracleDB sınıfları ile artık hem MsSQL veritabanında hem de Oracle veritabanında işlem yapabiliyoruz.

Son olarak ExampleManager isimli bir sınıf oluşturuyoruz, bu sınıftan nesne oluştururken yapıcı metoduna parametre olarak MsSQLDB sınıfından bir nesne gönderirsek ekleme, silme, güncelleme, kaydetme işlemini MsSQL veritabanı üzerinde yapacaktır, OracleDB sınıfından bir nesne gönderirsek de Oracle veritabanı üzerinde yapacaktır. 

Ekran Çıktısı:

Serdar YILMAZ

jQuery ve Yazım Kuralları

jquery logojQuery, 2006 yılında John Resig tarafından geliştirilmiş açık kaynak kodlu bir JavaScript kütüphanesidir. Web geliştiricilerinin sıkça başvurduğu JavaScript komutlarını ve fonksiyonlarını hazır bir şekilde sunmaktadır.

jQuery Kütüphanesinin Sayfaya Eklenmesi

jQuery kütüphanesindeki komutları ve fonksiyonları kullanabilmek için kütüphaneyi sayfaya eklememiz gerekmektedir. Kütüphaneyi sayfaya eklemek için konumunu <head> </head> etiketi arasında bildiriyoruz.

Yukarıdaki örnekte jQuery kütüphanesini Google’un CDN sunucularından çekerek sayfamıza ekledik. Dilersek jQuery kütüphanesini “jquery.com” adresinden bilgisayarımıza indirip, dosya konumunu “src” özelliğinde belirterek de kullanabiliriz.

jQuery Yazım Kuralları

JavaScript dilinin bütün yazım kuralları jQuery kütüphanesi içinde geçerlidir.

jqueryEk olarak; yukarıdaki örnekte de görüldüğü gibi jQuery kodlarımız temel olarak “$” işareti, seçici, kullanılacak metod ve metoda gönderilecek parametre bilgisinden oluşmaktadır. Parantezler içerisindeki tırnaklar tek(‘) veya çift(“) tırnak olabilir. Temiz bir kodlama için kod satırları “;” ile bitirilmelidir. Ayrıca aşağıdaki örnekte olduğu gibi jQuery’de metotlar art arda yazılabilir.

jQuery kodlarının, DOM yüklendikten sonra çalışması için kodlarımızı aşağıdaki kod blogunun arasına yazmaktayız. Böylece olası bir çok hatayı önlemiş olacağız.

Fonksiyonların Yazım Şekli ve Kullanımı

Aşağıdaki örnekte 3 farklı şekilde fonksiyon tanımlandık.

Tanımlamış olduğumuz fonksiyonların çağrımı aşağıdaki gibidir.

Serdar YILMAZ

jQuery – Hiyerarşik Seçiciler

E F Seçicileri

Kod

Açıklama

Yukarıdaki kod, body etiketinin iki alt seviyesindeki (torunu) h1 etiketini seçecektir.

jQuery - Seçiciler

$(‘body h1’)


E+F Seçicileri

Kod

Açıklama

Yukarıdaki kod, div etiketi ile aynı seviyede (komşu) olan ilk small etiketini seçecektir.

jQuery - Seçiciler

$(‘div+small’)


E~F Seçicileri

Kod

Açıklama

Yukarıdaki kod, div etiketi ile aynı seviyede (komşu) olan tüm small etiketlerini seçecektir.

jQuery - Seçiciler

$(‘div~small’)


E>F Seçicileri

Kod

Açıklama

Yukarıdaki kod, ul etiketi içerisindeki bütün li etiketlerini seçecektir.

jQuery - Seçiciler

$(‘ul>li’)

ul etiketinin sadece bir alt seviyesindeki li etiketleri seçilir. İki veya daha alt seviyedeki li etiketleri seçilmez.


E, F, G Seçicileri

Kod

Açıklama

Virgül konularak belirtilen tüm etiketleri seçer. Yukarıdaki kod, HTML sayfamızdaki tüm a ve ul etiketlerini seçecektir.


* Seçicisi

Kod

Açıklama

Yukarıdaki kod, HTML sayfamızdaki bütün etiketleri seçecektir.


Örnek Uygulama

Serdar YILMAZ

jQuery – ID Seçiciler

Kod

Açıklama

Yukarıdaki kod satırı “Baslik” ID’li etiketin yazı rengini kırmızı yapacaktır. $(‘#Baslik’) ifadesi, “Baslik” ID’li etiketi seçer. ID adından önce “#” işareti koyulmalıdır.

Örnek


Serdar YILMAZ

jQuery – Class Seçiciler

Kod

Açıklama

Yukarıdaki kod satırı c1 class’ını kullanan tüm etiketlerin arkaplan rengini değiştirecektir. $(‘.c1’) ifadesi c1 class’ını kullanan tüm etiketleri seçer. Class adından önce “.” işareti koyulmalıdır.

Örnek

Serdar YILMAZ

jQuery – Tag Seçiciler

Kod

Açıklama

HTML sayfamızda aynı etiketten birden fazla bulunabilir. Yapacağımız değişikliğin ilgili etiketin kullanıldığı her yerde geçerli olması için etiket seçicileri kullanabiliriz. Yukarıdaki kod, sayfamızdaki tüm p etiketlerinin yazı rengini kırmızı yapacaktır.

Örnek 

Serdar YILMAZ

C# – Temel ve Türetilmiş Sınıf Referansları

dotnetC#’da farklı türden referansların birbirine aktarılması yasaklanmıştır. Örneğin, A ve B isminde iki sınıfımız olsun. A sınıfından oluşturulan bir nesnenin adresini B sınıfından oluşturulan bir referansta tutamayız, aynı şekilde B sınıfından oluşturulan bir nesnenin adresini de A sınıfından oluşturulan bir referansta tutamayız.

Kalıtım ile Türetilmiş sınıftan oluşturulan bir nesnenin adresini, Temel sınıftan oluşturulan bir referansta tutabiliriz.

Kedi ve Insan sınıfı Memeli sınıfından Türetilmiştir. Bu durum da Memeli sınıfı Temel sınıf, Insan ve Kedi sınıfı da Türetilmiş sınıftır.

Açıklama satırlarında da belirtildiği üzere; Insan ve Kedi sınıfları Memeli sınıfından türetildiği için bu sınıflardan oluşturulan nesnelerin adresleri Memeli sınıfından oluşturulan referanslarda tutulabilir. Yalnız burada dikkat edilmesi gereken çok önemli bir husus bulunmakta. Memeli sınıfını inceleyecek olursak içerisinde “TurBilgisi()” adında bir metodun olmadığını görürüz. Bu yüzden Insan veya Kedi sınıfından oluşturulan bir nesnenin adresini Memeli sınıfından oluşturulan bir referansa aktardığımız taktirde “TurBilgisi()” metoduna erişemeyiz. Çünkü Memeli sınıfı içerisinde böyle bir metot bulunmamaktadır.

C# Kalıtım

Türetilmiş sınıf, temel sınıf içerisindeki değişkenleri ve metotları kendi içerisinde tanımlanmış gibi kullanabilir. Ancak temel sınıf, türetilmiş sınıftaki değişkenleri ve metotları kullanamaz.

Insan ve Kedi sınıfları, Memeli sınıfından türetildiği için “Bilgi()” metoduna Insan ve Kedi sınıfından oluşturulan nesnelerin referanslarını parametre olarak gönderebiliriz.

Serdar YILMAZ

C# – Üye Gizleme

dotnetTemel sınıf içerisinde bulunan elemanlardan public ve protected erişim belirteçli olanların kalıtım yoluyla Türetilmiş sınıfa aktarıldığından bahsetmiştik (Bkz: C# – Kalıtım). Peki Temel sınıfta ve Türetilmiş sınıfta aynı isme sahip elemanlar tanımlarsak ne olur?

A Temel sınıf, B ise Türetilmiş sınıftır. Temel sınıfta ve Türetilmiş sınıfta aynı isme sahip elemanlar tanımladığımız için Visual Studio uyarı verecektir. Bu uyarının sebebi; Türetilmiş sınıf içerisindeki elemanların, aynı isimli Temel sınıf elemanlarını gizlemesinden kaynaklanmaktadır.

Türetilmiş sınıfın elemanları Temel sınıfın elemanlarını gizlediği için B sınıfından bir nesne oluşturup “Uye_1” ve “Uye_2” elemanlarına erişmek istediğimiz de B sınıfı içerisinde tanımlanmış olan “Uye_1” ve “Uye_2” elemanlarına erişebiliriz. Ekran çıktısı;

Üye gizleme olayının gerçekleştiği durumlar da Visual Studio bu işlemi yanlışlıkla yaptığımızı düşünerek bize bir uyarı verecektir. Bu işlemi kontrollü bir şekilde yaptığımızı belirtmek için new anahtar sözcüğünü kullanırız.

Yapmış olduğumuz düzenlemeden sonra Visual Studio artık uyarı vermeyecektir. Peki Temel sınıf içerisinde ki “Uye_1” ve “Uye_2” elemanlarına nasıl erişebiliriz ?

Temel sınıf içerisindeki “Uye_1” ve “Uye_2” elemanlarına Türetilmiş sınıf içerisinden erişebilmek için base anahtar sözcüğünü kullanırız. Base anahtar sözcüğü türetmenin yapıldığı temel sınıfı temsil eder. Base anahtar sözcüğünün kullanımına Yapıcı Metotlar ve Kalıtım konusunda da değinmiştik.

Serdar YILMAZ

C# – Yapıcı Metotlar ve Kalıtım

dotnetTüretilmiş sınıftan bir nesne oluşturduğumuz da önce temel sınıfın yapıcı metodu sonra da türetilmiş sınıfın yapıcı metodu çalışacaktır.

A temel sınıf, B ise türetilmiş sınıftır. Bu yüzden B sınıfından bir nesne oluşturduğumuz da (B nesne=new B();) önce A sınıfının yapıcı metodu sonra da B sınıfının yapıcı metodu çalışacaktır.  Ekran çıktısı;

Her yapıcı metodun kendi tanımlandığı sınıfın üye elemanları ile ilgili iş yapması gerekir.

base Anahtar Sözcüğü

Türetilmiş sınıf içerisinden temel sınıfın elemanlarına erişmek için base anahtar sözcüğünü kullanırız.

A temel sınıf, B ise türetilmiş sınıftır. Temel sınıfın yapıcı metoduna türetilmiş sınıf üzerinden parametre gönderebilmek için base anahtar sözcüğünü kullanırız.

B sınıfından nesne oluştururken girdiğimiz birinci(10) ve ikinci(15) parametreler A sınıfının yapıcı metoduna gönderilecektir. Üçüncü(20) ve dördünce(25) parametreler ise B sınıfının yapıcı metodu içerisinde kullanılacaktır. Ekran çıktısı;

Türetme ile sınıflar arasında hiyerarşik bir yapı sağlanır.

base anahtar sözcüğü C sınıfında B sınıfını; B sınıfında da A sınıfını temsil eder. C sınıfından bir nesne oluşturduğumuz da önce A sınıfının yapıcı metodu, sonra B sınıfının yapıcı metodu en son da C sınıfının yapıcı metodu çalışacaktır.

C sınıfından nesne oluştururken girdiğimiz birinci(10) ve ikinci(15) parametreler B sınıfının yapıcı metoduna gönderilecektir. Üçüncü(20) parametre ise C sınıfının yapıcı metodu içerisinde kullanılacaktır. B sınıfına gönderilen birinci(10) ve ikinci(15) parametrelerden ilki(10) A sınıfının yapıcı metoduna gönderilecektir ve ikinci(15) parametre de B sınıfı içerisinde kullanılacaktır.

Serdar YILMAZ