Nesne Yönelimli Programlama IV
Miras Alma(Inheritance)
Miras alma yeni sınıflar oluşturmanızı sağlar. Bir sınıf içinde davranışını tanımladığınız öğeleri miras alınmış sınıf içinde yeniden kullanabilir, bu sınıfa yeni öğeler ekleyebilir ve var olan üyeler üzerinde değişiklikler yapabilirsiniz. Üyeleri miras alınan sınıfa Temel Sınıf(Base Class) ve miras alınan sınıfa Türetilmiş Sınıf(Derived Class) adı verilir. Esas olarak bütün sınıflar “Object” sınıfından türetilmiştir. .Net içinde bulunan dillerde çoklu miras desteklenmez, türetilmiş sınıfların sadece bir temel sınıfı olabilir. Temel sınıftan türetilmiş sınıf oluşturmak için;
class ProductDetail : Product
{
// Türetilmiş Sınıf : Temel Sınıf
}
Varsayılan olarak bütün sınıflar miras alınabilir. Ancak bir sınıfın temel sınıf olarak kullanılamayacağını ya da sadece temel sınıf olarak kullanılabileceğini belirleyebilirsiniz. Bir sınıfın temel sınıf olarak kullanılamayacağını aşağıdaki gibi belirleyebilirsiniz;
public sealed class Product
{
// sealed keywordü Temel Sınıf olamayacağını belirler.
}
Bir sınıfın sadece temel sınıf olarak kullanılabileceğini belirtmek için;
public abstract class Product
{
// abstract keywordü sadece Temel Sınıf olabileceğini belirler.
}
Eziciler
Varsayılan olarak, türetilmiş bir sınıf temel sınıfın bütün üyelerini miras alır. Eğer türetilmiş bir üyenin davranışını değiştirmek istiyorsanız, onu ezmeniz gerekir. Bunun anlamı türetilmiş sınıfa yeni bir metot, property ya da event eklemenizdir. Aşağıda bulunan niteleyiciler property ve metotların nasıl ezileceği gösterir;
virtual: Sınıf üyelerinin türetilmiş sınıf içinde ezilmesini sağlar. Örnek;
class ProductBase
{
// Otomatik olarak eklenmiş virtual property.
// Eğer get ve set metotları eklenirse Ezicilerin sağladığı özel davranışlar kullanılır
public virtual string Name
{
get;
set;
}
// Otomatik eklenmemiş propertyde virtual kullanımı
private int _Code;
public virtual int Code
{
get { return _Code; }
set { _Code = value; }
}
}
class Product : ProductBase
{
private string _Name;
// Otomatik eklenmiş bir proprtynin sıradan bir property ile ezilmesi
// ve özel davranışların kazandırılması
public override string Name
{
get
{
return base.Name;
}
set
{
_Name = value != String.Empty ? value : “Adsız”;
}
}
}
override: Temel sınıf içinde tanımlanan sanal ya da ezilebilir üyelerin ezilmesinde kullanılır. Örneğin;
abstract class Product
{
public abstract int GetProduct();
}
class ProductDetail : Product
{
int ProductId = 0;
public ProductDetail(int productId)
{
ProductId = productId;
}
public override int GetProduct()
{
return ProductId;
}
static void Main()
{
ProductDetail productDetail = new ProductDetail(435);
}
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
}
abstract: Temel sınıfta abstract olarak belirlenen sınıf üyeleri türetilmiş sınıflara da eklenmelidir. Türetilmiş sınıflarda bu üyeler ezilmelidir. Yukarıdaki örneği inceleyebilirsiniz.
new: Temel sınıftan türetilmiş üyeleri gizler. Türetilmiş bir üyeyi gizlediğinizde bu üyenin türetilmiş versiyonu temel sınıf versiyonu ile yer değiştirir. Temel sınıf üyelerini new sözcüğünü kullanmadan da gizleyebilirsiniz bunun sonucunda sadece uyarı oluşturur. Eğer new sözcüğünü kullanırsanız uyarıyı önler ve türetilmiş versiyonu değiştirir. Türetilmiş bir üyeyi gizlemek için türetilmiş sınıf içinde bu üyeyi tanıtın ve new sözcüğünü ekleyin. Örneğin;
public class Product
{
public int ProductId;
public void Invoke()
{
}
}
public class ProductDetail : Product
{
new public void Invoke()
{
}
}
Interfaceler
Interfaceler, sınıflar gibi propertyler, metotlar ve olaylar tanımlamamızı sağlar. Interfaceler sınıflara implemente edilirler ve sınıflardan farklı öğeleri tanımlarlar. Interfaceler bir ilişkiyi temsil ederler, bir interfacei implemente eden sınıf o interfacein bütün öğelerini tanımlandığı gibi implemente etmelidir. Örnek;
interface IProduct
{
void GetProduct()
{
}
}
public class Product : IProduct
{
void IProduct.GetProduct()
{
// Eklenti metodun kod bloğu
}
}
Genericler
.Net içinde bulunan sınıflara, structurelara, interfacelere ve metotlara parametreler geçebilirsiniz, bu parametreler nesnelerin tipini tanımlar. Genericlerin en çok kullanıldığı örnek koleksiyonlar(collection)dır, koleksiyon için de bulunan nesnelerin tipini belirlediğiniz yerdir. Generic bir sınıf tanımlamak için;
public class Product<T>
{
public T ProductName;
}
Generic bir sınıfın örneğini almak için;
Product<string> product = new Product<string>();
product.ProductName = “Balls”;
Delegeler
Delege metot imzasını tanımlayan bir tiptir ve uyumlu bir imza ile her metoda referans sağlayabilir. Delege ile bir metodu çağırabilir ya da invoke edebilirsiniz. Delegeler diğer metotlara parametre göndermek için kullanılırlar. Delege oluşturmak için;
public delegate void ProductDelegate(string productCode);
Delege tarafından belirlenen imzası uyuşan bir metoda referans oluşturmak için;
public class Product
{
public delegate void GetProductDelegate(string productCode);
}
public class ProductDetail
{
public static void GetProduct(string productCode)
{
// Kod
}
void ProductDelegate()
{
Product.GetProductDelegate getProductDelegate = GetProduct;
getProductDelegate(“123”);
}
}