Class Types — Sınıf Türleri — C#

Nesne yönelimli programlamada, sınıflar nesnelerin nasıl davranacağını ve neler yapabileceğini tanımlayan veri yapılarıdır. Çeşitli sınıf türleri bulunur ve her biri belirli bir amaca hizmet eder. Her sınıf türünün amacını ve özelliklerini anlayarak, belirli senaryolar için en uygun olanını seçmek gerekir. Bu şekilde daha temiz, bakımı daha kolay kodlar yazılabilir.
Sınıf Türleri
- Regular/Concrete Class (Temel Sınıf)
- Abstract Class (Soyut Sınıf)
- Static Class (Statik Sınıf)
- Sealed Class (Mühürlü Sınıf)
- Partial Class (Kısmi Sınıf)
- Generic Class (Jenerik Sınıf)
1. Regular/Concrete Class (Temel Sınıf)
Temel sınıflar, özel bir anahtar kelime veya modifikasyon kullanılmadan oluşturulan sınıflardır. Bu sınıflar, nesne yönelimli programlamanın en temel yapı taşlarıdır ve çoğu durumda başlangıç noktası olarak kullanılır. Temel sınıflar, genellikle new anahtar kelimesi ile nesne oluşturmak istediğimiz sınıflar için kullanırız.
// Regular Class Örneği
public class Person
{
// Properties / Özellikler
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
// Constructor Method / Kurucu Metot
public Person(string firstName, string lastName, int age)
{
FirstName = firstName;
LastName = lastName;
Age = age;
}
// Method / Metot
public void Promotion()
{
Console.WriteLine($"Hello, my name is {FirstName} {LastName} and I am {Age} years old.");
}
}
Kullanım Alanı
Bir nesnenin temel özelliklerini ve davranışlarını tanımlamak istediğinizde.
Karmaşık olmayan ve özel bir modifikasyon gerektirmeyen sınıflar oluşturmak istediğinizde.
Diğer sınıflar tarafından miras alınabilecek ve genişletilebilecek sınıflar oluşturmak istediğinizde.
2. Abstract Class (Soyut Sınıf)
Soyut sınıflar, doğrudan bir nesne olarak örneklenmeyen, ancak diğer sınıflar tarafından türetilebilen bir sınıf türüdür. Soyut sınıflar, genellikle temel sınıf olarak kullanılır ve alt sınıflarının uygulaması gereken soyut üyeleri tanımlar. Soyut sınıflar, bazı temel işlevsellikleri sağlar ve soyut üyeler aracılığıyla alt sınıfların kendi özel davranışlarını tanımlamalarını zorunlu kılar. Soyut sınıflar, soyut metotlar, özellikler ve olaylar içerebilir. Bunun yanı sıra soyut olmayan metot, özellik ve olaylarda içerebilir.
Soyut olarak tanımlanan metotlar aynı interface de tanımlandığı gibi gövdesiz olarak tanımlanırlar. Soyut sınıf, abstract anahtar kelimesi kullanılarak oluşturulurlar. ve bu sınıftan nesne oluşturulamaz. Yani new anahtar kelimesi ile bir örnekleri oluşturulamaz.
// Abstract Class Örneği
namespace ExampleProject
{
// Soyut bir sınıf tanımı
public abstract class Shape
{
// Soyut bir metot. Alt sınıflar bu metodu uygulamak zorundadır.
public abstract double CalculateArea();
// Soyut olmayan bir metot. Alt sınıflar tarafından kullanılabilir.
public void DisplayInfo()
{
Console.WriteLine("This is a shape.");
}
}
}namespace ExampleProject
{
// Soyut sınıfı miras alan bir alt sınıf
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// CalculateArea metodunu Circle sınıfı için uygular
public override double CalculateArea()
{
return Math.PI * Radius * Radius;
}
}
}namespace ExampleProject
{
// Bir başka alt sınıf
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
// CalculateArea metodunu Rectangle sınıfı için uygular
public override double CalculateArea()
{
return Width * Height;
}
}
}
Shape isimli soyut sınıf, CalculateArea isminde soyut bir metoda sahiptir.
Circle ve Rectangle sınıfları, Shape sınıfını miras alır ve CalculateArea metodunu kendi ihtiyaçlarına göre uygular.
Shape sınıfı doğrudan örneklenemez, ancak Circle ve Rectangle sınıfları örneklenebilir ve CalculateArea metodunu çağırarak her bir şeklin alanını hesaplayabilir.
Bu abstract sınıf içerisinde tanımlanmış abstract metotlar kalıtım alan sınıf tarafından implemente edilmek zorundadır. abstract metot sadece tanım içerir, bir metot gövdesi yoktur. Bu sınıfların içerisinde abstract metot dışında metotlarda tanımlanıp kullanılabilir.
Soyutlama için kullanıldığı için genel olarak interface ile kıyaslanır. interface içerisinde tanımlanan tüm metotlar kalıtım alınan sınıf tarafından uygulanması zorunludur. abstract sınıflarda ise sadece abstract olarak tanımlanmış metotlar kalıtım alınan sınıf tarafından uygulanması zorunludur.
abstract olarak tanımlanan sınıf static ve sealed olarak ayrıca tanımlanamazlar.
Kullanım Alanı
Gelecek sınıfların takip etmesi gereken bir şablon tanımlamak istediğinizde.
İlgili sınıf grupları için ortak bir temel sağlamak istediğinizde.
Alt sınıfların geçersiz kılabileceği bazı varsayılan metot implementasyonları sağlamak istediğinizde.
3. Static Class (Statik Sınıf)
Statik sınıflar, yalnızca statik üyeler içeren ve örneklenemeyen sınıflardır. Bu sınıfların üyelerine, sınıf adı kullanılarak erişilir. Statik sınıflar genellikle yardımcı (utility) veya genel amaçlı işlevsellikler sağlamak için kullanılır. Statik sınıflar, uygulama boyunca değişmeyen ve bir nesne örneğine bağlı olmayan metotlar, özellikler veya alanlar içerir. Statik sınıf, static anahtar kelimesi kullanılarak oluşturulurlar.
// Static Class Örneği
namespace ExampleProject
{
// Statik bir sınıf tanımı
// Bu sınıf farklı sınıflar tarafından kalıtım alınamayacaktır.
// Bu sınıftan nesne üretilemez.
public static class MathUtilities
{
// Statik bir alan
public static double Pi = 3.14159;
// Statik bir metot
public static double Multiply(double a, double b)
{
return a * b;
}
}
}namespace ExampleProject
{
class Program
{
static void Main(string[] args)
{
// Statik sınıfın üyelerine sınıf ismi üzerinden erişim
double product = MathUtilities.Multiply(2, 8);
Console.WriteLine($"Product: {product}");
}
}
}
staticolarak tanımlanan sınıf sealed ve abstractolarak ayrıca tanımlanamazlar.
Kullanım Alanı
Bir sınıfın örneği oluşturulmadan çağrılması gereken yardımcı metotlar oluşturmak istediğinizde.
Genel amaçlı görevleri gerçekleştiren ve herhangi bir örneğe özel verilere dayanmayan metotlar oluşturduğunuzda.
İlişkili metotları daha iyi organize etmek ve kapsüllemek istediğinizde.
4. Sealed Class (Mühürlü Sınıf)
Mühürlü sınıflar, başka sınıflar tarafından türetilemeyen bir sınıf türüdür. Yani, sealed anahtar kelimesiyle tanımlanan bir sınıf miras alınamaz. sealed anahtar kelimesi, sınıfın güvenlik, performans veya mantıksal bütünlük gibi nedenlerle miras alınmasının önlenmesi gerektiğinde kullanılır.
Bu, sınıf hiyerarşisi üzerinde bir kontrol seviyesi sağlar ve diğer geliştiriciler tarafından değiştirilmesini veya genişletilmesini önler. Bu sınıflar, herhangi bir sınıf gibi özellikler, metotlar ve alanlar içerebilir, ancak miras alınamazlar.
Sealed sınıfı miras almaya çalışan bir sınıf (derleme hatası verir). Ayrıca, JIT derleyici (Just-In-Time compiler) tarafından bazı optimizasyonların yapılmasına olanak tanır, çünkü sınıfın daha fazla türetilmeyeceği garanti altındadır.
// Sealed Class Örneği
namespace ExampleProject
{
/* Bu sınıf farklı sınıflar tarafından kalıtım alınamayacaktır. */
public sealed class CommonCalculator
{
public int GetTotal(int x, int y)
{
return x + y;
}
}
}
sealedolarak tanımlanan sınıf static ve abstractolarak ayrıca tanımlanamazlar.
Kullanım Alanı
Uygulamanızın kilit bir bileşenini temsil eden bir sınıf tasarladığınızda ve bu sınıfın genişletilmesini/kalıtım alınmasını istemediğinizde.
Performans optimizasyonu sağlamak istediğinizde.
5. Partial Class (Kısmi Sınıf)
Kısmi sınıflar, bir sınıfın tanımının birden fazla dosyada veya aynı dosya içinde parçalara ayrılmasına izin veren bir anahtar kelimedir. Sınıflar bazen satırlarca kod ve çok fazla metot içerebilirler. Bu şekilde büyük ve karmaşık hale geldikleri için yönetilmesini zorlaştırabilir.
Bu, özellikle büyük projelerde ve farklı kod parçaları üzerinde çalışan birden çok geliştiricinin bulunduğu durumlarda kodun daha düzenli ve bakımı daha kolay olmasını sağlar. Kısmi sınıf, partial anahtar kelimesi kullanılarak oluşturulurlar.
// Partial Class Örneği
// Dosya: CustomUrl.Customer.cs
// class isimleri içeride aynı yazılır
// fakat dosya kayıt edilirken yakın ama farklı isimlerle kayıt edilir.
namespace ExampleProject
{
public partial class CustomUrl
{
public string GetCustomerProductUrl()
{
return "/api/getcustomerproduct/";
}
}
}// Partial Class Örneği
// Dosya adı: CustomUrl.Auth.cs
// class isimleri içeride aynı yazılır
// fakat dosya kayıt edilirken yakın ama farklı isimlerle kayıt edilir.
namespace ExampleProject
{
public partial class CustomUrl
{
public string GetTokenUrl()
{
return "/api/gettoken";
}
}
}
Genel olarak büyük projelerde bazen geliştiriciler aynı dosyalarda çalışmak durumuda kalır ve burada yaşanacak kodsal bir çakışmayı ayıklamak bazen kolay olmadığı gibi kayıplarda yaşanabiliyor. Bu gibi durumlarda büyük kod parçacıklarını mantıklı bir şekilde bölmek işlemleri rahatatacaktır.
Kullanım Alanı
Kod üretim araçları kullanarak bir sınıfı değiştiriyorsanız ve kendi özel kodunuzu ayrı tutmak istiyorsanız.
Bir sınıf tanımını düzenleme amacıyla birden çok dosyaya bölmek istiyorsanız.
Birden çok geliştiriciyle çalışıyorsanız ve her biri sınıfın farklı kısımları üzerinde bağımsız olarak çalışabiliyorsa.
6. Generic Class (Jenerik Sınıf)
Jenerik sınıflar, veri türünden bağımsız olarak çalışabilen sınıflardır. Bu sınıflar, kod tekrarını azaltmak ve tür güvenliğini artırmak için kullanılır. Jenerik sınıflar, aynı kodun farklı veri türleriyle çalışabilmesini sağlar.
Jenerik sınıflar, tip parametrelerini kullanarak tanımlanır. Tip parametreleri, sınıfın, metodun veya arayüzün tanımında belirtilir ve kodun hangi türlerle çalışacağını belirler. Bu tip parametreler genellikle
// Generic Class Örneği
namespace ExampleProject
{
// Generic sınıf örneği
public class GenericClass
{
private T data;
public GenericClass(T value)
{
data = value;
}
public T GetData()
{
return data;
}
public void DisplayData()
{
Console.WriteLine("Data: " + data);
}
}
}
Jenerik sınıflar, aynı mantığı farklı veri türleriyle kullanmak istediğinizde kod tekrarını önler ve tür güvenliğini sağlar. Örneğin, koleksiyon sınıfları
List
, Dictionary
gibi generic olarak tanımlanmıştır ve herhangi bir veri türüyle çalışabilir.
Kullanım Alanı
Farklı veri türleriyle çalışabilen kod yazmak istediğinizde.
Kod tekrarını azaltmak ve bakımını kolaylaştırmak istediğinizde.
Tür güvenliğini artırmak ve derleme zamanında hataları yakalamak istediğinizde.
