Şablon Türler (Generics)

Benzer belgeler
Nesneye Dayalı Programlama

Koleksiyonlar (Collections)

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

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

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

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

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

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

Lambda İfadeleri (Lambda Expressions)

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

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

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

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

public static int Toplam int x, int y

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

BİL-141 Bilgisayar Programlama I (Java)

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

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

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

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Nesneye Dayalı Programlama

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

Nesne Yönelimli Programlama ve Kalıtım

Programlama Dilleri 3

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

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

NESNE TABANLI PROGRAMLAMA-2 DERS UYGULAMALARI-1

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

YZM 2116 Veri Yapıları

BMH-303 Nesneye Yönelik Programlama

YZM 2105 Nesneye Yönelik Programlama

«BM364» Veritabanı Uygulamaları

BİL-142 Bilgisayar Programlama II

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

Spring Framework Eğitimi

BOĞAZİÇİ ÜNİVERSİTESİ UNVAN DEĞİŞİKLİĞİ SINAVI PROGRAMCI

MOBIL UYGULAMA GELIŞTIRME

NESNEYE DAYALI PROGRAMLAMA 11. HAFTA UYGULAMA DERSİ

11- FONKSİYONLAR (FUNCTIONS)

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

BTEP243 Ders 3. class Yazım Kuralı:

NESNEYE YÖNELİK PROGRAMLAMA

HSancak Nesne Tabanlı Programlama I Ders Notları

BMH-303 Nesneye Yönelik Programlama

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

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.

DATA STRUCTURES. Part IV. IEEE 754 FP Standardı, Dinamik Dizi, Koleksiyonlar, Diğer Önemli Konular ve İlgili Programlama Örnekleri

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

Akış Konrol Mekanizmaları

Programlama Dilleri 3

YZM 2116 Veri Yapıları

EĞİTİM : LINQ to SQL. Bölüm : LINQ e Genel Bakış. Konu : LINQ Nedir? Page 1 of 25

HSancak Nesne Tabanlı Programlama I Ders Notları

Ders 8 Konu Özeti ve Problemler

YZM311 YAZILIM YAPIMI BÖLÜM 4 TASARIM KALIPLARI. Yrd. Doç. Dr. Volkan TUNALI Mühendislik ve Doğa Bilimleri Fakültesi / Maltepe Üniversitesi

Programlama Dilleri 3

Veritabanı İşlemleri

C# Metotlar ve Metot Tanımlama

Arasınav Örnek Soruları Bahar 2018

Lecture 11: Generics

Sınıf Diyagramları Amaç: Sınıf Diyagramları Nasıl Çizilir?

Giri. Program yazmaya balamadan önce

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

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Erişim konusunda iki taraf vardır:

C# Console Uygulamaları ifelse Yapıları 2

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

giriş program yapısı değişkenler metotlar class kontrol deyimleri döngü deyimleri diziler struct try. catch files GUI

Görsel Programlama 1

Class LinkedList java.lang.object java.util.abstractcollection java.util.abstractlist java.util.abstractsequentiallist java.util.

Business Delegate Tasarım Şablonu KurumsalJava.com

Merge (Bireşim) Algoritmayı önce bir örnek üzerinde açıklayalım.

Ders 8: Metotlar. barisgokce.com

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Nesneye Dayalı Programlama

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

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

C#.Net & Linq (Language Integrated Query)

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

static void dizi_24() { Random rnd = new Random(); int [] tutulan=new int[10]; int dogru;

YZM 2105 Nesneye Yönelik Programlama

Veri Yapıları ve Algoritmalar dönem

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:

TARİHÇE. Versiyon Tarih Düzenleyen Açıklama Engin DURMAZ İlk versiyon

İş Parçacıkları Thread(s)

Nesne Yönelimli Programlama

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: 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.

BİLİŞİM TEKNOLOJİLERİ

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19. Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Programlama Dilleri III 1

C# Çalışma Örnekleri

Transkript:

Şablon Türler (Generics)

CLR 1.0 da çalışma zamanında belli olmayan sınıfları kullanan esnek sınıf ve metotlar, Object sınıfı temel alınarak oluşturulması gerekmekteydi. CLR 2.0 dan itibaren Generic lerin kullanımı ile artık böyle bir zorunluluk mevcut değildir. Generic sınıflar olabileceği gibi, generic temsilci, interface ve metotlar da olabilir.

Avantaj / Dezavantaj Performans (Performance) Tip Günvenliği (Type Safety) Tekrar kod kullanımı (Binary code reuse) Kod Fazlalığı (Code Bloat) İsimlendirme (Naming Guidelines)

i)performans Generic lerin en büyük avantajlarından birisi performanstır. Herhangi bir değer tipinden üyeleri olan bir koleksiyon üzerinde işlem yapılırken sık sık boxing/unboxing işlemleri yapılır. Bu ise performansta büyük ölçüde düşüşe neden olur.

Örnek class Program static void Main(string[] args) ArrayList list = new ArrayList(); list.add(44); //boxing int i1 = (int)list[0]; // unboxing foreach (int i2 in list) Console.WriteLine(i2); //unboxing

class Program static void Main(string[] args) List<int> list = new List<int>(); list.add(44); //no boxing - Değer tipleri List<int> içinde saklanmakta int i1 = (int)list[0]; // unboxing, cast işlemine gerek yok. foreach (int i2 in list) Console.WriteLine(i2); //unboxing

ii)tip Güvenliği (Type Safety) class Program static void Main(string[] args) ArrayList list = new ArrayList(); list.add(44); list.add("mystring"); list.add(new Program()); int i1 = (int)list[0]; foreach (int i2 in list) Console.WriteLine(i2);?

class Program static void Main(string[] args) List<int> list = new List<int>(); list.add(44); list.add("mystring"); list.add(new Program()); int i1 = (int)list[0]; foreach (int i2 in list) Console.WriteLine(i2);?

iii) Tekrar Kod Kullanımı (Binary Code Reuse) Generic ikili kodun tekrar kullanımına izin verirler. Generic sınıf bir defa tanımlanır ve başka tiplerde pekçok örneği (instance) oluşturulur. C++ dan farklı olarak kaynak koda erişmek gerekli değildir.

Örneğin List<T> sınıfının (System.Collections.Generic) çeşitli örnekleri aşağıdadır: List<int> list = new List<int>(); list.add(44); List<string> stringlist = new List<string>(); stringlist.add( bilgisayar mühendisliği ); List<MyClass> myclasslist = new List<MyClass>(); myclasslist.add(new MyClass());

iv) Kod Fazlalığı (Code Bloat) Generic sınıf tanımlaması assembly seviyesinde olduğundan, istenilen türde generic sınıf instance ı oluşturmak, IL kodunda bu sınıfların aynılarının üretilmesini sağlamayacaktır. Fakat, generic sınıflar JIT tarafından derlendiğinde, istenilen her bir tür için yeni bir sınıf oluşturulacaktır.

v) İsimlendirme (Naming Guidelines) Generic türler program içerisinde kullanılacağında generic olmayan türlerden ayırt edilebilmesi gerekmektedir. Bunun için: Generic tip isimleri T harfi ile başlamalıdır. Generic türle ilgili eğer özel bir gereksinim veya iki veya daha fazla generic tür kullanılıyorsa tip isimleri için tanımlayıcı isimler seçilmelidir.

Public class List<T> Public class LinkedList<T> Public class SortedList <TKey, TValue>

Generic Sınıfları Oluşturmak (LinkedList Example-Şablon Tipleri Kullanmadan) public class LinkListNode private object value; public LinkListNode(object value) this.value = value; public object Value get return value; set this.value = Value; public LinkListNode Next get; set;

public class LinkListe public LinkListNode Head get; private set; public LinkListNode Tail get; private set; public LinkListNode temp get; private set; public void AddFirst(LinkListNode value) temp = Head; Head = value; Head.Next = temp; public void ekranayaz() temp = Head; while ((temp)!= null) Console.WriteLine("0", temp.value); temp = temp.next;

Generic Sınıfları Oluşturmak (LinkedList Example-Şablon Tipleri Kullanarak) public class LinkListNode<T> private T value; public LinkListNode(T value) this.value = value; public T Value get return value; set this.value = Value; public LinkListNode<T> Next get; set;

public class LinkListe<T> public LinkListNode<T> Head get; private set; public LinkListNode<T> Tail get; private set; public LinkListNode<T> temp get; private set; public void AddFirst(LinkListNode<T> value) temp = Head; Head = value; Head.Next = temp; public void ekranayaz() temp = Head; while ((temp)!= null) Console.WriteLine("0", temp.value); temp = temp.next;

class Singly_Link static void Main(string[] args) LinkListe<string> liste = new LinkListe<string> (); LinkListNode<string> a1 = new LinkListNode<string>("Merhaba"); LinkListNode<string> a2 = new LinkListNode<string>("Bilgisayar"); LinkListNode<string> a3 = new LinkListNode<string>("Mühendisliği"); liste.addfirst(a1); liste.addfirst(a2); liste.addfirst(a3); Console.WriteLine("*************"); liste.ekranayaz();

İkinci örnekte, LinkListe sınıfı, LinkListe<T> yazımı ile şablon türe dönüştürülmüştür. Artık LinkListe<T>, LinkListNode<T> türünden elemanlar alabilir.

Şablon Tülerin Özellikleri (Generic Classes Features)

Örnek public class DocumentManager<T> private readonly Queue<T> documentqueue = new Queue<T>(); public void AddDocument(T doc) lock (this) documentqueue.enqueue(doc); public bool IsDocumentAvailable get return documentqueue.count > 0;

Lock Anahtar Sözcüğü Lock anahtar sözcüğü bir threadin diğer başka bir threadin işlem yaptığı kritik bölgeye girmesini engellemektedir. Lock anahatar sözcüğü ile kilitlenmiş olan nesneneye diğer threadin erişebilmesi için bu nesnenin release edilmesi gerekmektedir. http://msdn.microsoft.com/enus/library/c5kehkcz.aspx

Varsayılan Değerler (Default Values) Şablon bir türe null değerini atamak mümkün değildir. Böyle bir durumda default anahtar sözcüğü kullanılır. Şimdi DocumentManager<T> sınıfımıza GetDocument() metotdunu ekleyelim.

public T GetDocument() T doc = default(t); lock (this) doc = documentqueue.dequeue(); return doc;

Kısıtlar (Constraints) DocumentManager<T> sınıfına DisplayAll Documents() metotdunu ekleyelim.

public void DisplayAllDocuments() foreach (T doc in documentqueue) Console.WriteLine(doc.Title);?

Çalışma zamanında meydana gelen hatanın düzeltilebilmesi için şablon türde olan DocumentManager<T> sınıfında bazı kısıtlamalara gitmek gerekir. Kısıtlamaları sağlamak için where anahtar sözcüğü kullanılır.

public class DocumentManager<T> where T:IDocument private readonly Queue<T> documentqueue = new Queue<T>(); public void AddDocument(T doc) lock (this) documentqueue.enqueue(doc); public bool IsDocumentAvailable get return documentqueue.count > 0;

public T GetDocument() T doc = default(t); lock (this) doc = documentqueue.dequeue(); return doc; public void DisplayAllDocuments() foreach (T doc in documentqueue) Console.WriteLine(doc.Title);

Değişik Kısıtlar da Mevcuttur

Inheritance Şablon bir tür, başka bir sınıftan veya şablon sınıftan türeyebilir. Bir arayüzü implement edebilir. Türeyen sınıf şablon türden olabilir veya olmayabilir.

public class LinkedList<T> : IEnumerable<T> public class Base<T>.. public class Derived<T>:Base<string>

public abstract class Calc<T> public abstract T Add ( T x, T y); public abstract T Sub(T x, T y); public class SimpleCalc:Calc<int> public override int Add (int x, int y) return x+y; public override int Sub(int x, int y) return x - y;

Statik Üyeler Şablon türlerin statik üyeleri sınıfın bir örneği tarafından paylaşılırlar.

public class StaticDemo<T> public static int x; static void Main(string[] args) StaticDemo<string>.x = 4; StaticDemo<int>.x = 5; Console.WriteLine(StaticDemo<string>.x);?

Şablon Arayüzler (Generic Interfaces) Sınıflarda olduğu gibi arayüzler ile birlikte de şablon tipler kullanılabilmektedir.

public interface IComparable<T> int CompareTo(T other); public class Person : IComparable<Person> public int CompareTo(Person other) return this.lastname.compareto(other.lastname);........

Şablon Metotlar (Generic Methods) Şablon türde sınıflar tanımlanabildiği gibi şablon türde metotlar da tanımlanabilir.

class Program public static void Swap<T>(ref T x, ref T y) T temp; temp = x; x = y; y = temp; static void Main(string[] args) int i = 4; int j = 5; Swap<int>(ref i, ref j);

Örnek

public class Account private string name; public string Name get return name; private decimal balance; public decimal Balance get return balance; public Account(string name, Decimal balance) this.name = name; this.balance = balance;

Bütün hesaplar (accounts) bir listede tutulsun. class Program static void Main(string[] args) List<Account> accounts = new List<Account>(); accounts.add(new Account("Christian", 1500)); accounts.add(new Account("Sharon", 2200)); accounts.add(new Account("Katie", 1800));

Toplamı hesaplamak için tüm Account nesneleri üzerinde foreach döngüsü ile dolaşılabilir. Foreach yapısı koleksiyon elemanları üzerinde dolaşabilmek IEnumerable arayüzünü kullandığı için toplamı hesaplamak için yazılacak olan metot da, IEnumerable türünde parametre almalıdır.

public static class Algorithm public static decimal AccumulateSimple(IEnumerable<Account> e) decimal sum = 0; foreach (Account a in e) sum += a.balance; return sum;

AccumulateSimple() metodu aşağıdaki şekilde çağırabilir. public static class Algorithm static void Main(string[] args) List<Account> accounts = new List<Account>(); accounts.add(new Account("Christian", 1500)); accounts.add(new Account("Sharon", 2200)); accounts.add(new Account("Katie", 1800)); decimal amount = Algorithm.AccumulateSimple(accounts);

Aynı örnek için farklı bir Accumulate() metodu yazalım. Şablon metotlarda şablon sınıflarda olduğu gibi where anahtar sözcüğü ile sınırlandırmaya (constraint) gidilebilir.

public static class Algorithm public static decimal Accumulate<TAccount>(IEnumerable<TAccount> coll) where TAccount : IAccount decimal sum = 0; foreach (TAccount a in coll) sum += a.balance; return sum;

class Program static void Main(string[] args) List<Account> accounts = new List<Account>(); accounts.add(new Account("Christian", 1500)); accounts.add(new Account("Sharon", 2200)); accounts.add(new Account("Katie", 1800)); decimal amount = Algorithm.Accumulate<Account>(accounts); Console.WriteLine(amount.ToString());?

public class Account:IAccount private string name; public string Name get return name; private decimal balance; public decimal Balance get return balance; public Account(string name, Decimal balance) this.name = name; this.balance = balance;

Şablon türün parametresi derleyici tarafından, metodun parametresinden otomatik olarak çıkarıldığından aşağıdaki gibi bir yazım da geçerlidir.

class Program static void Main(string[] args) List<Account> accounts = new List<Account>(); accounts.add(new Account("Christian", 1500)); accounts.add(new Account("Sharon", 2200)); accounts.add(new Account("Katie", 1800)); decimal amount = Algorithm.Accumulate(accounts); Console.WriteLine(amount.ToString());

Şablon Temsilciler (Generic Delegates)

Account sınıfına ait örnekteki Accumulate() isimli metodu aşağıdaki gibi değiştirelim.

public static class Algorithm public static TSummary Accumulate <TInput, TSummary> (IEnumerable<TInput> coll, Action<TInput,TSummary> action) TSummary sum = default(tsummary); foreach (TInput input in coll) sum = action(input,sum); return sum; Delegate Türünden IEnumerable Türünden

Accumulate() metodunun ikinci parametresi Action temsilcisi türündendir. Action temsilcisini ise aşağıdaki şekilde tanımlamak mümküdür. public delegate TSummary Action<TInput, Tsummary> (TInput t, TSummary u);

Accumulate() metodu aşağıdaki şekilde invoke edilebilir.

class Program static void Main(string[] args) List<Account> accounts = new List<Account>(); accounts.add(new Account("Christian", 1500)); accounts.add(new Account("Sharon", 2200)); accounts.add(new Account("Katie", 1800)); decimal amount = Algorithm.Accumulate<Account, decimal>(accounts, delegate(account a, decimal d) return a.balance + d;); Console.WriteLine(amount.ToString());