Nesneye Yönelik Programlama - C# Ders Notları Dr. Suat KARAKAYA

Benzer belgeler
abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

YZM 2105 Nesneye Yönelik Programlama

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

C++ Dersi: Nesne Tabanlı Programlama

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

public static int Toplam int x, int y

Nesne Yönelimli Programlama ve Kalıtım

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

BİL-141 Bilgisayar Programlama I (Java)

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Nesne Yönelimli Programlama

YZM 2105 Nesneye Yönelik Programlama

Sunum İçeriği. Programlamaya Giriş

YZM 2105 Nesneye Yönelik Programlama

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

Nesneye Dayalı Programlama

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

HSancak Nesne Tabanlı Programlama I Ders Notları

Kalıtım (Inheritance)

C++ Dersi: Nesne Tabanlı Programlama

Görsel Programlama-I (Visual Programming) 2.Hafta

Operator Aşırı Yükleme (Operator OverLoading)

SINIF YAPISI ve NESNE YÖNELİMLİ PROGRAMLAMA NESNE YÖNELİMLİ PROGRAMLAMA

HSancak Nesne Tabanlı Programlama I Ders Notları

Erişim konusunda iki taraf vardır:

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

MOBIL UYGULAMA GELIŞTIRME

BTEP243 Ders 3. class Yazım Kuralı:

Ders 8 Konu Özeti ve Problemler

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

YZM 2105 Nesneye Yönelik Programlama

C++ Dersi: Nesne Tabanlı Programlama

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

CBÜ Teknoloji Fakültesi, Yazılım Mühendisliği. Nesneye Yönelik Programlama

7. HAFTA. Erişim Belirleyiciler

NESNEYE YÖNELİK PROGRAMLAMA

1 PROGRAMLAMAYA GİRİŞ

YZM 2108 Yazılım Mimarisi ve Tasarımı

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

YZM 2105 Nesneye Yönelik Programlama

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Bu parçalar arasındaki ilişkiyi kullanıp büyük çaplı programlar geliştirme tekniğine de nesne yönelimli programlama denir.

C# Metotlar ve Metot Tanımlama

Ders 8: Metotlar. barisgokce.com

Nesne Yönelimli Programlama

Operatörlerin Aşırı Yüklenmesi

BİL-142 Bilgisayar Programlama II

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

HSancak Nesne Tabanlı Programlama I Ders Notları

NESNE TABANLI PROGRAMLAMA Temel Kavramlar

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Inheritance. Inheritance (turetim)

NESNEYE YÖNELİK PROGRAMLAMA

Nesneye Dayalı Programlama

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Lambda İfadeleri (Lambda Expressions)

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

NESNEYE YÖNELİK PROGRAMLAMA

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

HSancak Nesne Tabanlı Programlama I Ders Notları

Bölüm 12. Nesne yönelimli programlama desteği

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

3. NESNE TABANLI PROGRAMLAMANIN PRENSİPLERİ

Şablon Türler (Generics)

Nesne Yönelimli Programlama

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Göstericiler (Pointers)

Java Dersi. Altuğ Bilgin Altıntaş

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

C#(Sharp) Programlama Dili

İsimler ve Kapsam. Hafta 4 Ders 2 BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

Programlama Dilleri 3

1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

C++ ile Nesneye Dayalı Programlama

Programlama Dilleri 3

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

C++ Dersi: Nesne Tabanlı Programlama

WEB PROGRAMLAMA II. Öğr. Gör. M. Mutlu YAPICI. Ankara Üniversitesi Elmadağ Meslek Yüksekokulu

C++ Dersi: Nesne Tabanlı Programlama

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

NESNE TABANLI PROGRAMLAMA

Nesneye Yönelik Programlama (OOP) 7.Hafta

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

11- FONKSİYONLAR (FUNCTIONS)

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

Programlama Dillerinde Kullanılan Veri Tipleri

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 9

VERİ TABANI İŞLEMLERİ (NESNE TABANLI PROGRAMLAMA TEKNİĞİ İLE)

2.2- DEĞİŞKENLER VE SABİTLER ÇALIŞMA YAPRAĞI

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Transkript:

Ders Notları Dr. Suat KARAKAYA Inheritance (Kalıtım/Miras) NYP uyumlu geliştirme ortamlarında polymorphism (çok biçimlilik) sağlamanın bir yolu da kalıtım yoluyla sınıf türetmektir. Temel olarak kalıtım işlemi, bir sınıftan başka bir sınıf türetme işlemidir. Bu yaklaşımla var olan sınıflar geliştirilebilir veya yeni bir sınıf tanımlanabilir. Uygulamamızda yazacağımız sınıfa benzer özelliklere sahip bir sınıf elimizde zaten varsa, bu sınıfı yazacağımız yeni sııfa aktararak ihtiyaç duyduğumuz bazı özelliklerini kullanabiliriz. Yapılan işlem asıl sınıfı miras alarak ondan yeni bir sınıf türetmektir. Yeni oluşan sınıfa türemiş sınıf (derived class), miras veren sınıf ise temel sınıf (base class) olarak isimlendirilir. Türemiş sınıf temel sınıfın izin verilen tüm özelliklerini taşır. Ayrıca yeni üyeler eklenerek genişletilebilir. Türemiş sınıf da bir başka sınıfa miras yoluyla aktarılabilir. Bir sınıf birden fazla sınıfa kalıtım yoluyla aktarılabilir. Ancak sadece bir sınıftan kalıtım alabilir. Kalıtım işlemi : operatörü ile gerçekleştirilir. Bir Base class (Temel sınıf) tan bir derived class (türeyen sınıf) a miras yoluyla sınıf üyelerini nasıl aktarırız? Örnek bir uygulama ile görelim: class TemelSinif internal int x; internal int y get; set; internal void metot1() Console.WriteLine("TemelSinif metodu..."); class TureyenSinif : TemelSinif TureyenSinif t1 = new TureyenSinif(); t1.x = 2; t1.y = 8; t1.metot1(); Console.ReadKey(); Inheritance (kalıtım/miras) yolulya birden fazla sınıftan üye kazanılamaz. Bu girişim derleme hatası ile sonuçlanacaktır. class Person1 public string Name get; set; public string Surname get; set; class Person2 public string Departmet get; set; public string City get; set; class Student : Person1, Person2 public int StudentId get; set; TemelSinif classında 3 üye tanımlanmıştır: x(field), y(property), metot1(metot). TureyenSinif classında herhangi bir üye bulunmuyor. Tüm üyeleri kalıtımdan geliyor. x alanı, y özelliği ve metot1 metodu TemelSinif classından miras alınmıştır. Student classı Person1 ve Person2 classlarından kalıtım almak istediğinde bu geçersiz bir işlem olarak kabul edilecektir. (Person1 ve Person2 interface olsaydı bu mümkün olabilirdi.)

Bir Base classtan (Person) birden çok derived classa (Student ve Worker) miras yoluyla sınıf üyelerini nasıl aktarırız? Örnek bir uygulama ile görelim: class Person public string Name get; set; public string Surname get; set; class Student : Person public int StudentId get; set; class Worker : Person public int WorkerId get; set; Student std1 = new Student(); Worker wrk1 = new Worker(); Person prs1 = new Person(); Interface kullanarak yaptığımız işlemler (implementasyonlar), class inheritance ile yaptığımız işlemlere benzemektedir. Aradaki temel fark, interfaceler tek başına bir anlam ifade etmezken, kalıtım veren (base class) tek başına kullanılabilen bağımsız bir sınıftır. Bir diğer fark ise interface kullaırken çoklu implementasyon (çoklu kalıtım) yapılabilirken, class interface uygulamasında tek bir base classtan kalıtım alınabilir. Uygulamada sadece derived classlar kullanılacaksa bir başka deyişle base sınıf yapsına ihtiyaç yoksa interface kullanımı daha mantıklı bir çözüm olacaktır. Ancak kısıtlanmış bir base class veya abstract class (ilerleyen notlarda bahsedilecek) gerekliliği varsa class inheritance uygulamak daha doğru bir çözüm olacaktır. Access Modifiers (Erişim Bildirgeçleri) Private: Sadece tanımlı olan blokta (sınıf vb.) geçerlidir. Protected: Sadece tanımlı olduğu blokta geçerlidir. Ekstra olarak inherit edildiği sınıflarda da tanımlıdır. Private ile yapılamayan bu işlem protected seviyesinde yapılabilir. Internal: Bağlı bulunduğu proje (Assembly) içerisinde referans ihtiyacı duyulmadan kullanılabilir. Aynı Namespace altındaki alanlara erişebilir. Assembly dışında erişilemez. Class lar varsayılan olarak internal seviyedindedir. Public: Harici bir projeden de erişilebilen alanlardır. Referans eklendikten sonra ve using <Namespace> satırının eklenmesinin ardından tüm projelerde public tanımlanmış elemanlara erişilebilir. Virtual Methods (Sanal Metotlar) Person classında 2 adet property bulunuyor: Name, Surname. Bu property ler miras olarak Student ve Worker classlarına aktarılmak isteniyor. Student classında kendisinde ait 1 üye var. Bu üye miras değil: StudentId. Worker classında kendisinde ait 1 üye var. Bu üye miras değil: WorkerId. Worker classı: kendisinde ait 1 üye + miras aldığı 2 üyeye sahiptir. Student classı: kendisinde ait 1 üye + miras aldığı 2 üyeye sahiptir. Person classı: kendisinde ait 1 üyeye sahiptir. Base class içerisinde varsayılan bir içerik ile tanımlanmış bir metot virtual sözcüğü ile tanımlanırsa, miras alan bir sınıf (derived class) içerisinde içeriği yeniden yazılabilir. (Metot varsayılan formatından çıkarılarak üzerine yazılabilir). Bu işleme override adı verilir. Derived class içerisinde, yeniden yapılandırılmak istenen bir virtual metot, override ön sözcüğü ile tanımlanır. Bu işlem sonucunda, virtual metodun yapısı sadece override yapan türeyen sınıfta değişir. Temel sınıfta ve varsa diğer türeyen sınıflarda değişim olmaz. 2

Virtual metotları ve override işlemini bir problem üzerinde inceleyelim: Communicate isimli sınıf içerisinde varsayılan bir veri gönderme metodu yazılıyor. Bu metodun birçok haberleşme terminali (hyper, siow, vb.) için ortak bir çözüm sunduğu varsayılıyor ve varsayılan metotları içeren Communicate sınıfı tüm haberleşme terminellerine base olarak kalıtım veriyor. Ancak bazı terminallerde (örn. docklight) data göndermek için varsayılan yöntemin dışında ekstra bir takım işlemler yapılması veya tamamen farklı bir operasyon gerçekleştirilmesi gerekiyor. Az sayıda olsa da bu istisnaları yönetebilmek için base classta tanımlı Send() metodunda değişiklik yapılmasına yetki verilmesi istenmektedir. Bu yetkiyi vermek için Send() metodu virtual olarak tanımlanmıştır. Virtual olarak tanımlandıktan sonra miras alan sınıfların tümü varsayılan Send() metodunu kullanmaya devam edebilir. Ekstra bir işleme gerek yoktur. Ancak virtual sözcüğü bu metodun türeyen sınıflar tarafından yeniden tasarlanmasına izin vermektedir. Bu yetki kullanılarak Docklight sınıfı içerisinde Send() metodu istenilen biçimde yeniden tasarlanmıştır. class Communicate public virtual void Send() Console.WriteLine("data sended (default)"); public void Receive() Console.WriteLine("data received (default)"); class Docklight : Communicate public override void Send() Console.WriteLine("data send via Docklight"); class Hyper : Communicate Hyper hyp1 = new Hyper(); Docklight dc1 = new Docklight(); hyp1.send(); hyp1.receive(); dc1.send(); Console.ReadKey(); hyp1.send(); hyp1.receive(); dc1.send(); Açıklamalar: Hyper sınıfı, kalıtım aldığı Communicate sınıfının Send() metodunu olduğu gibi kullanmayı tercih etmiştir. Bunu yapmak için (Send metodu virtual olarak tanımlanış olsa dahi) inheritance operasyonu dışında bir işlem yapılmasına gerek yoktur. Ancak, Docklight sınıfı, kalıtım aldığı Communicate sınıfının Send() metodunu kullanmak yerine kendine özgü bir Send metodu uygulamayı tercih etmektedir. Bunu yapmak için metodun 3

adını değiştirmeksizin override sözcüğünü kullanarak metodun içeriğini tekrar yazma şansına sahiptir. Docklight sınıfı Receive() metodunu da kalıtım yolu ile Communicate sınıfından almıştır. Ancak bu metodu olduğu gibi kullanmaktadır. Override yapmamıştır. Zaten Receive metodu temel sınıfta virtual olarak tanımlanmadığı için istense bile override işlemine tabi tutulamaz. Özetle, inheriance yaptığımız sınıfta (temel sınıf/base class) genel bir operasyon var ve her ortamda bu operasyon ayın şekilde yapılıyorsa, bu operasyonu virtual tanımlamaya gerek yoktur. Ama bazı ortamlarda değişik bir formatta kullanmak gerekiyorsa bu operasyonu yeniden yazmamız gerekiyorsa, temel sınıftan bunun için izin alınması gerekir. Bunu sağlayan ön sözcük ise virtual sözcüğüdür. base sözcüğü: türeyen sınıf içerisinde temel sınıfın üyelerine erişmek için kullanılan ifadedir. Base classı temsil eden sözcüktür. Temel sınıfta tanımlı bir operasyonu kullanmadan önce özel bir konfigürasyon yapılması gerekiyorsa, türeyen sınıf içerisinde override yapılarak önce bu konfigürasyon gerçekleştirilir, sonra base.operasyon() gibi bir işlem adımı ile temel sınıf metodu çağırılabilir. class Communicate public virtual void Send() Console.WriteLine("data sended (default)"); public void Receive() Console.WriteLine("data received (default)"); class Docklight : Communicate public override void Send() Console.WriteLine("gerekli ön konfigurasyonlar yapıldı."); base.send(); Açıklamalar: Docklight sınıfı, kalıtım aldığı Communicate sınıfının Send() metodunu olduğu gibi kullanabilmektedir. Ancak bu metodu kullanmadan önce kendine has bir takım ön işlemler gerekli olduğu ve bu konfigürasyonlar yapıldıktan sonra base classtaki Send() metodunun kullanılabileceği varsayılsın. Bu durumda 2 seçeneğimiz var: 1. Docklight sınıfında override Send() metodu altında tüm konfigürasyonlar ve veri gönderme protokolleri dahil sıfırdan yeni bir metot yazmak, 2. Docklight sınıfında override Send() metodu altında sadece bu sınıfa ait ön konfigürasyonları yazıp, veri gönderme protokolleri ile ilgili işlemleri temel sınıftan olduğu gibi almak. 4

Verilen örnekte 2. Yol tercih edilmiştir. 1. seçenek de aynı sonucu verecektir ancak Send() metodunun içerdiği varsayılan veri gönderme protokolleri temel sınıfta verilen varsayılan metot ile kalıtım alan Docklight sınıfında ortak olduğu için bunu tekrar sıfırdan yazmak verimli olmayacaktır. Bu tip durumlarda base sözcüğü aracılığı ile temel sınıf referans gösterilebilir ve varsayılan metotlar override metotlar altında çağırılabilir. Interface ler ile class inheritance arasında tercih yaparken gözetilebilecek bir kriter de bu konu olarak düşünülebilir. Örnekte verilen tipte bir durum varsa class inheritance yaklaşımı daha doğru bir çözüm olacaktır. Abstract Class (Soyut Sınıf) Soyut sınıflar da interface kullanımına ve virtual metotlara benzer bir amaçla tanımlanır. Hatırlarsak, interface ler içerisinde belli prototipleri tanımlayıp, implemente edilen sınıflar içinde bu prototipleri tam olarak tanımlamayı zorunlu hale getirmiştik. Virtual metotlarda ise belirlediğimiz operasyonları kalıtım yoluyla alan türeyen sınıflar, override işlemi ile bu metotları yeniden tanımlayabiliyordu. Ancak interface lerdeki gibi bir zorunluluk yoktu. Abstract classlar ise interface ile virtual metotların bir kesişimi gibi düşünülebilir. Interface gibi soyut kavramlar değildir, gerçek metotlar içerebilir. Ancak interface ler gibi, kalıtım verdiği sınıfıta üyelerin override edilmesini zorunlu kılar. İsteğe bağlı olarak ister tüm üyeler, ister seçilen üyeler override edilmeye mecbur bırakılabilir. Soyut sınıflar sadece ve sadece inheritance vermek için tanımlanırlar. Interface ler ile benzer biçimde new operasyonu ile türetilemezler. Abstract classlar hem tamamlanmış hem de prototip üyeler içerebilir. (interfaceler sadece prototip içerebilir.) Tamamlanmış olarak verilen üyeler miras alan sınıflarda doğrudan kullanılabilir. Prototip olarak verilen üyeler abstract sözcüğü ile tanımlanır ve miras alan sınıflarda override edilmesi zorunludur. Abstract bir sınıf üyesi, türeyen bir sınıfta tamamlanmış olarak override edilmezse derleyici hatası oluşacaktır. Hatırlatma1: Virtual metotlarda böyle bir durum yoktu. Virtual metotlar istenirse override edilebilir, zorunlu değildir. Hatırlatma2: interface lerde böyle bir durum vardı. Prototip olarak bulunan bir üye implemente edilen sınıfta inheritance olarak da adlandırılabilir tamamlanmış olarak tanımlanmak zorundadır. Abstract class konusunu bir örnek problem üzerinden açıklayalım: Haberleşme işlemi gerçekleştiren 2 terminal programı kullanan bir yazılım için bir veri yönetimi programı yazmak istiyoruz. Terminaller : hyper, siow. Haberleşme yönetimi için kullanılan temel bir sınıf tanımlayalım. Bu sınıf içerisinde veri gönderme ve veri okuma operasyonlarını gerçekleştiren 2 adet metot bulunsun. (Send() ve Read()) Veri gönderme işlemi, tüm haberleşme terminelleri için ortak bir şekilde gerçekleştiği varsayılsın. Veri okuma operasyonu ise, istisnasız tüm terminaller için benzersiz birer teknikle gerçekleştirildiği varsayılsın. Bu durumda tüm terminaller ortak veri gönderme metodunu kullanacak, ancak veri okuma aşamasında her terminal kendi özgün veri okuma metodunu kullanacaktır. 5

abstract class Communication public void Send() Console.WriteLine("Data gönderildi (default). "); public abstract void Read(); class Hyper : Communication public override void Read() Console.WriteLine("Hyper terminal'e özel data okuma işlemi..."); class Siow : Communication public override void Read() Console.WriteLine("Siow terminal'e özel veri okuma işlemi..."); ; Verilen sınıf tanımlamaları dahilinde main() metodu altında bu sınıflardan nesneler türeterek hangi metotları koşturabildiklerini inceleyelim: Siow siow1 = new Siow(); Hyper hyper1 = new Hyper(); siow1.send(); siow1.read(); hyper1.send(); hyper1.read(); Console.ReadKey(); Communication soyut sınıfında tanımlı. Siow sınıfında override edildi. Communication soyut sınıfında tanımlı. Hyper sınıfında override edildi. 6