C Sharp Programlama Dili/Kısmi tipler ve metotlar
Kısmi türler
değiştirŞimdi daha önceden gördüğümüz bir şeyi hatırlatmak istiyorum. Kodlarımızı birden fazla dosyaya parçalayıp bu parçaları komut satırında hep birlikte derleyebiliriz. Yani programımızın bir sınıfını bir dosyaya, başka bir sınıfını başka bir dosyaya koyup komut satırında toplu derleme yaparsak bütün bu dosyalar sanki bir dosyadaymış gibi işlem görecektir. Aynı olayı isim alanı düzeyinde de yapabiliriz. Yani bir isim alanını bir dosyaya, başka bir isim alanını bir dosyaya koyup komut isteminde toplu derleme yaparsak yine iki isim alanı da aynı dosyadaymış gibi işlem görecektir.
Ancak şimdiye kadar gördüğümüz şekliyle bir sınıfın bir metodunun başka bir dosyaya başka bir metodunun başka bir dosyaya koyulması mümkün değildir. Şimdi bunu nasıl yapabileceğimizi göreceğiz. Bir sınıfın bazı metotlarını bir dosyaya bazı metotlarını başka bir dosyaya koymak için her iki dosyada aynı isimli sınıflar oluşturur ama her iki sınıfı da partial olarak işaretleriz. Örnek:
bir.cs dosyası
partial class sinif
{
...
}
iki.cs dosyası
partial class sinif
{
...
}
Komut isteminden csc bir.cs iki.cs
komutunu verirsek bu iki dosyadaki sınıfların içeriği birleştirilecektir. Kısmi türlerle ilgili bazı ufak bilgiler:
- Birleştirilmesini istediğimiz bütün aynı isimli türleri partial olarak bildirmeliyiz. Yalnızca birisini partial olarak bildirmek yeterli değildir.
- Sınıflar, yapılar ve arayüzler partial olarak bildirilebilir.
- Kısmi sınıflardan biri sealed ya da abstract anahtar sözcüğüyle belirtilmişse diğerinin de belirtilmesine gerek yoktur. Bütün sınıflar sealed veya abstract olur. Herhangi bir tür başka bir sınıftan türemişse diğerleri de o sınıftan türemiş sayılır. Herhangi bir tür bir arayüzü uygulamışsa diğerlerinin de uyguladığı sayılır.
- Partial türlerin partial olarak bildirildi diye illaki başka bir dosyayla ilişkilendirilmesine gerek yoktur.
- Türün bir parçasına erişim belirleyicisi koymuşsak diğer parçalarına da koymaya gerek kalmaz. Ancak erişim belirleyiciler birbiriyle çelişemez.
- Kısmi tipler diğer parçalarındaki üye elemanları kullanabilir.
- İçiçe türler söz konusu olduğunda içteki türler de partial olabilir. Örnek:
bir.cs:
partial class DisSinif
{
partial class IcSinif
{
void Metot() { }
}
}
iki.cs:
partial class DisSinif
{
partial class IcSinif
{
void Metot2() { }
}
}
Aslında kısmi türler, kısmi olmayan türlerin içine koyulabilir. Ancak bu durumda dosya parçalanamaz. Örnek:
class DisSinif
{
partial class IcSinif{}
partial class IcSinif{}
}
Elbetteki partial olarak bildirilen sınıf parçalarının farklı dosyalara koyulma zorunluluğu yoktur.
Derleme zamanında kısmi tiplerin nitelikleri ve XML yorumları birleştirilir (bunları ileride göreceğiz).
Kısmi tipler oluştururken partial
anahtar sözcüğünün class
, struct
ve interface
anahtar sözcüklerinden hemen önce yazılması gerekir.
Kısmi tipin bütün parçalarının aynı assembly'ye (.exe veya .dll dosyası) koyulması gerekir.
Şablonlu tipler de kısmi olabilir. Bu durumda tipin diğer parçalarının da aynı isimli şablonlara, aynı sırada sahip olması gerekir. Eğer kısmi şablon tiplerden birisi tip parametresi kısıtı almışsa diğerinin almasına gerek kalmaz. Diğerinin aynı şablon tip kısıtlarını aldığı varsayılır. Şablon tipleri ileride göreceğiz.
İçiçe tiplerdeki içteki kısmi tip new
anahtar sözcüğü ile işaretlenmişse (bilinçli isim gizleme yapmışsa) bu kısmi tipin diğer parçalarının aynı new
anahtar sözcüğünü kullanmasına gerek kalmaz.
Kısmi metotlar
değiştirKısmi metot kavramı kısmi tür kavramından biraz farklıdır. Kısmi metotlarda metodun bir kısmını bir dosyada bir kısmını başka bir dosyada yazmayız. Bunun yerine metodun imzasını bir yere, uygulanmasını bir yere yazarız. Metodun uygulanması opsiyoneldir, uygulanmayabilir de. Metodun imzası ve uygulanması kısmi türün aynı parçalarına yazılabileceği gibi farklı parçalarına da yazılabilir. Eğer imzası belirtilen metot uygulanmazsa derleyici bu metot imzasını ve bu metoda olan bütün çağrıları siler. Sadece geri dönüş tipi void
olan metotlar kısmi olabilir. Sadece kısmi bir sınıf veya yapı kısmi metot içerebilir. Kısmi metotlar da partial
anahtar sözcüğüyle belirtilir. Örnek:
bir.cs:
partial class Sinif
{
partial void Metot();
}
iki.cs:
partial class Sinif
{
partial void Metot()
{
//...
}
}
Kısmi metotlar public olamaz. Çünkü başka sınıflar kısmi metodun uygulanıp uygulanmadığını bilemez. Kısmi metotlar static olabilir. Ancak partial
anahtar sözcüğü void
anahtar sözcüğünden hemen önce gelmelidir, ayrıca metotların geri dönüş tipinin metot isminden hemen önce yazılması gerektiği hatırlanmalıdır. Yavru sınıflar kısmi metodun oluşturulup oluşturulmayacağını bilemeyeceği için kısmi metotlar virtual, abstract veya override olarak işaretlenemez. Kısmi metotlar ref parametre alabilir, ancak out parametre alamaz. Kısmi metotlar unsafe
anahtar sözcüğüyle işaretlenebilir. unsafe
anahtar sözcüğü göstericiler konusunda anlatılacaktır. Kısmi metotlar şablonlu olabilir. Bu konu da ileride anlatılacaktır.
Kısmi metotların uygulanıp uygulanmaması kısmi metodun imzasını tanımlayan sınıf parçası için çoğu durumda önemsizdir. Kısmi metodun geri dönüş tipi void olmak zorunda olduğu için kısmi metodun uygulanıp uygulanmaması kısmi metodun imzasını içeren sınıf parçasında yalnızca ilgili metodun çağrılması veya çağrılmamasıyla sonuçlanır. Ancak istisnai sayılabilecek bazı durumlarda kısmi metodun uygulanıp uygulanmaması kısmi metodun imzasını içeren sınıf parçasının işleyişinde başka etkilere de neden olabilir. Örnek:
bir.cs:
partial class Sinif
{
int Metot2()
{
//Bir şeyler yap
}
static void Main()
{
Sinif s=new Sinif();
s.Metot(s.Metot2());
}
partial void Metot(int i);
}
iki.cs:
partial class Sinif
{
partial void Metot(int i)
{
//...
}
}
Burada iki.cs dosyasında Metot() metodunun uygulanıp uygulanmaması bir.cs dosyasında Metot2() metodunun işlerinin yapılıp yapılmamasına neden olur. Çünkü iki.cs dosyasında Metot() metodu uygulanmazsa bir.cs dosyasındaki Metot() metoduna olan çağrı da silinecektir. Eğer her halükarda Metot2() metodunun çalışmasını istiyorsak yukarıdaki kodu şöyle değiştirmeliyiz:
bir.cs:
partial class Sinif
{
int Metot2()
{
//Bir şeyler yap
}
static void Main()
{
int i=Metot2();
Metot(i);
}
partial void Metot(int i);
}
iki.cs:
partial class Sinif
{
partial void Metot(int i)
{
//...
}
}
Kısmi tür ve metotların kullanım alanı
değiştirKısmi türlerin en yaygın kullanım alanı Visual Studio gibi programlama ortamlarıdır. Bu yazılımlarda görsel arayüz sürükle-bırak yöntemiyle oluşturulur. Yazılım otomatik olarak görsel arayüzle ilgili kodları bir sınıfa ve farklı bir dosyaya yazar. Bu dosya normal şartlar altında programcıdan gizlenir. Bu sayede programcının yanlışlıkla bu dosyayı değiştirmesi engellenir. Ayrıca programın görsel arayüzünü ilgilendiren kodlarla programın mantığını ilgilendiren kodlar birbirinden ayrıldığı için programcının işi kolaylaşır. Ancak yazılım tarafından otomatik doldurulan bu sınıftaki form kontrollerine programcının ulaşabilmesi için programcının da aynı sınıfa programın mantığını ilgilendiren kodları yazması gerekmektedir. İşte programcının programın görsel arayüzüyle ilgili kodları görmeden aynı sınıfa programın mantığıyla ilgili kodları ekleyebilmesini sağlayan şey kısmi türlerdir.
Kısmi metot kavramı da benzer şekilde kullanılır. Örneğin Unity oyun motorunda programcı isterse kendine ayrılan dosyada Start(), Update(), vs. metotlarını oluşturup bu metotları doldurabilir. Bu metotların özel anlamları vardır. Bu metotlarla oyun başladığında, oyunun her bir döngüsünde, vs. çalışacak kodlar programcı tarafından yazılır. Bu metotların oluşturulmaması programın hata vermesine neden olmaz.