2 Eylül 2015 Çarşamba

C# ile abstract class kullanımı ve protected, public ve private keyword'lerine bakış

Merhabalar,

Bu yazımızda OOP nin temel keyword'lerinden bahsediyor olacağız.

public, protected ve private.

Aslında kapsamına göre sıralamış olduk. Bu keyword'ler property, class veya metod olabilir yani burada hiç bir sınırlama yok.


İçlerinde en geniş kapsamlı olanı PUBLIC.
Bu keyword ile tanımlanmış property, class veya metodu herhangi bir sınırlama olmadan her yerden kullanabiliriz.



    public class Deneme1
    {
        public int Number;
    }

    public class Deneme2
    {
        public Deneme1 DenemeDegisken;
    }



Yukarıdaki minik kod bloğunda gördüğünüz üzere Deneme1 class'ını public olarak tanımladık ve Deneme2 class'ı içerisinde gönül rahatlığı ile kullanabildik.

Peki gelelim property'lere. Kodumuzu aşağıdaki gibi düzenlersek hiç bir sorun yaşamayız.
Deneme1 class'ı içerisinde bir tane public bir tane de private property ekledik. Deneme2 class'ı içerisinden Deneme1 class'ındaki public değişkene ulaşıp istediğimiz gibi kullanabiliyoruz. Ancak "Ulasilamaz" property'si için aynı şeyi söyleyemiyeceğiz. Çünkü private olarak tanımlanmış ve sadece kendi Deneme1 class'ı içerisindeki metodlarda kullanılabilir.

    public class Deneme1
    {
        public int Number;
        private String Ulasilamaz;
        public String Ulasilabilir;
    }

    public class Deneme2
    {
        private void Process()
        {
            Deneme1 D = new Deneme1();
            D.Ulasilabilir = "";
        }
    }




Şimdi birazda protected keywordü üzerinde konuşalım. Bu keyword ağırlıklı olarak kalıtım dediğimiz inherit yöntemi kullanıldığında çok işimize yarıyor.

Aşağıdaki kod parçacığında görüldüğü üzere bir tane Human bir tane de Student class'ımız var. Human class'ımız Student class'ına inherit edilmiş durumda. Yani Student Class'ı Human class'ından türetilmiş. Bu durumda Student class'ı içerisindeki tüm metodlarda Human class'ının public, internal ve protected property'leri ve metodları kullanılabilir. Human class'ı içerisindeki Kullanilabilir property'si Student class'ı içerisinden kullanılabilir ve örnekte de sorunsuz bir şekilde kullanılmıştır.



    public abstract class Human
    {
        public String Name;
        public String SurName;
        public int IdentityNumber;
        public DateTime BirthDate;
        protected String Kullanilabilir;

    }
    public class Student : Human
    {
        public String SchoolName;
        public int SchoolNumber;
        protected DoSomething()
        {
            String A = this.Kullanilabilir;
        }
    }




Peki Student class'ını create edip başka bir yerde kullanmaya çalışırsam? Bahsettiğim kodu aşağıya ekledim. Student class'ı create edildi ve Human class'ının bir elemanı olan Kullanilabilir property'sine erişmeye çalıştık ama hata aldık. Ne demiştik, protected tanımlanmış property'ler, class'lar veya metodlar sadece inherit edildiği class içerisinde kullanılabilir. Human class'ı içerisindeki Kullanilabilir property'si public olarak tanımlanmış olsaydı aşağıdaki örnekte hata almadan kodumuzu yazmaya devam edecektik.





     public class Deneme
    {
        void Proces()
        {
            Student Ogrenci = new Student();
            Ogrenci.Kullanilabilir = ""; // Hatalı Satır
        }
    }



Sıra geldi interface ile çok karıştırılan ancak ikisi arasında bariz farklar olan abstract kullanımına. Abstract diyince aklınıza ilk olarak "Create Edilemez" ifadesi gelmeli. Çünkü abstract ön eki ile bir class oluşturulduğunda o class'ı "new" kodu ile create edemezsiniz. Editörünüz buna izin vermez ve size kızar. Abstract class'ların normal class'lardan tek farkı create edilemiyor olmasıdır. Onun dışındaki her türlü kullanıma açıktır.

Peki abstract nerede ve neden işimize yarasın ki dediğinizi duyar gibiyim :)

Yukarıdaki örneğimizide Human diye bir class vardı. Dikkat ettiyseniz bu class abstract ön eki almıştı. Durumu şöyle özetleyebiliriz. Human bizim en temeldeki class'ımız. Yeni doğmuş bir bebek gibi düşünebiliriz. Her bebek büyüyüp belli özelliklere sahip olur ama en başta bebektir. Bir bebeğin doğduğunda sahip olduğu tüm özellikleri hala taşımaktadır. ( 2 el, 2 göz, adı, soyadı vs.)

Bu durumda büyümüş her insan aslında bebek iken sahip olduğu özellikleri hala taşımaktadır. Yani aslında herkes biraz bebektir :) Bir öğrenci düşünün. Adı, soyadı, tckimlik numarası ve doğum tarihi gibi temel bilgilere sahiptir. Bir İnşaat işçisi düşünün aynı özelliklere inşaat işçisi de sahiptir.

Şimdi ben bir öğrenci class'ı oluşturmak istesem ne yapmam gerekir ? Saydığım bütün bu özellikleri bu class içerisine property olarak ekleyebilirim. Peki inşaat işçisi için bir class yaratmak istesem aynı özellikleri bu class içerisine de yazabilirim. Hobaa ben bu özellikleri az önce öğrenci class'ı için yazmıştım zaten bir daha neden yazıyorum ki demeli insan :) Hadi biz de öyle demiş olalım.

Bu temel bilgilerin olduğu Human diye bir class yaratıyorum. Bu saydığım özellikleri bu class'a ekliyorum. Daha sonra oluşturmak istediğim inşaat işçisi ve öğrenci class'larını Human class'ından türetip fazla kod yazmış olmaktan kurtuldum.

Buraya kadar aslında class'ların birbirinden türemesinin faydasını anlatmış olduk. Şimdi abstract ne işe yarıyor diyorsunuzdur herhalde.

Human class'ımız belirttiğimiz gibi abstract yani create edilemez olarak tanımlandı. Buradaki amaç
bir student yada işçi class'ı oluşturur gibi Human class'ını oluşturmak istemememiz.

Human class'ının görevi sadece benim için diğer class'lara temel bilgileri sunmasıdır. Human class'ını tek başına create edersem eğer sadece içindeki temel bilgileri kullanmış olurum ama ben bunu istemiyorum. Ben yeni class'lar yaratıp o class'ların bu temel özelliklere sahip olmasını istiyorum.





Bu yazımızda bir kaç bilgiyi daha paylaşmış olduk. Anlaşılmayan konular veya kavramlar için benimle her zaman iletişime geçebilirsiniz.

Son olarak yukarıda bahsetmiş olduğumuz kodlara ilişkin minik örneğimizin ekran görüntüsünü paylaşıyorum..