Arayüzler
C#’ta arayüzler (interfaces), sınıfların uygulaması gereken bir sözleşmeyi tanımlar ve bu sözleşme, sınıfın hangi yöntemleri ve özellikleri içereceğini belirtir, ancak bunların nasıl uygulanacağını içermez. Arayüzler, nesne yönelimli programlamada polimorfizmi destekler, bağımsız bileşenler arasında esnekliği artırır ve kodun yeniden kullanılabilirliğini sağlar. Özellikle birden fazla sınıfın aynı davranışları paylaşması gerektiğinde ve her sınıfın kendi uygulamasını sunmasını istediğinizde arayüzler kritik öneme sahiptir. Örneğin, bir IShape arayüzü Circle, Rectangle ve Triangle sınıfları tarafından uygulanabilir; her biri kendi alan ve çevre hesaplamalarını yapar.
Arayüzler, C#’ta sözdizimi, veri yapıları, algoritmalar ve OOP prensipleri (encapsulation, inheritance, polymorphism) ile doğrudan bağlantılıdır. Bu ders kapsamında okuyucu, arayüzleri tanımlamayı, sınıflarda uygulamayı, arayüz referansları üzerinden polimorfizm kullanmayı ve gerçek dünya projelerinde nasıl uygulanacağını öğrenecektir. Ayrıca en iyi uygulamalar, hata yönetimi ve performans optimizasyonları konularına değinilecektir, böylece yazılım mimarisinde sağlam ve sürdürülebilir çözümler üretebilirsiniz.
Temel Örnek
textusing System;
namespace InterfaceExample
{
interface IShape
{
double CalculateArea();
double CalculatePerimeter();
}
class Rectangle : IShape
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
public double CalculateArea()
{
return Width * Height;
}
public double CalculatePerimeter()
{
return 2 * (Width + Height);
}
}
class Program
{
static void Main(string[] args)
{
IShape myRectangle = new Rectangle(5, 10);
Console.WriteLine($"Alan: {myRectangle.CalculateArea()}");
Console.WriteLine($"Çevre: {myRectangle.CalculatePerimeter()}");
}
}
}
Bu temel örnekte, IShape arayüzü CalculateArea ve CalculatePerimeter yöntemlerinin imzalarını tanımlar; herhangi bir implementasyon içermez. Rectangle sınıfı bu arayüzü uygular ve gerekli metotların mantığını sağlar. Width ve Height özellikleri veri kapsülleme prensibini gösterir. Main metodunda IShape tipinde bir referans kullanılarak Rectangle nesnesi işlenir; bu, polimorfizmin bir örneğidir ve farklı IShape implementasyonları aynı şekilde kullanılabilir. Sözdizimi C# standartlarına uygundur: PascalCase sınıflar ve özellikler için, konsol çıktısı için Console.WriteLine, ve constructor kullanımı ile veri başlatımı gösterilmiştir.
Pratik Örnek
textusing System;
using System.Collections.Generic;
namespace AdvancedInterfaceExample
{
interface IShape
{
double CalculateArea();
double CalculatePerimeter();
string Name { get; }
}
class Circle : IShape
{
public double Radius { get; set; }
public string Name => "Circle";
public Circle(double radius)
{
Radius = radius;
}
public double CalculateArea()
{
return Math.PI * Radius * Radius;
}
public double CalculatePerimeter()
{
return 2 * Math.PI * Radius;
}
}
class ShapeProcessor
{
private List<IShape> shapes = new List<IShape>();
public void AddShape(IShape shape)
{
if(shape == null) throw new ArgumentNullException(nameof(shape));
shapes.Add(shape);
}
public void DisplayAllShapes()
{
foreach(var shape in shapes)
{
Console.WriteLine($"{shape.Name} - Alan: {shape.CalculateArea():F2}, Çevre: {shape.CalculatePerimeter():F2}");
}
}
}
class Program
{
static void Main(string[] args)
{
ShapeProcessor processor = new ShapeProcessor();
processor.AddShape(new Circle(7));
processor.AddShape(new Rectangle(5, 10));
processor.DisplayAllShapes();
}
}
}
Gelişmiş örnekte IShape arayüzü Name özelliğini içerir. Circle sınıfı Math.PI kullanarak alan ve çevre hesaplamalarını yapar. ShapeProcessor, farklı IShape nesnelerini yönetir; AddShape metodu null kontrolü yapar ve DisplayAllShapes tüm şekillerin detaylarını gösterir. Bu yapı, yeni IShape tipleri eklenmesini mevcut işleme mantığını değiştirmeden mümkün kılar, bu da arayüzlerin yazılım mimarisinde esnekliği ve sürdürülebilirliği nasıl sağladığını gösterir.
C#’ta arayüzler için en iyi uygulamalar: açık sözleşmeler tanımlamak, yüksek uyumluluk ve tek sorumluluk prensibini uygulamak ve arayüz isimlerinde "I" önekini kullanmak. Yaygın hatalar: metodların kısmi uygulanması, sorumlulukların aşırı yüklenmesi ve null kontrollerinin atlanması. Performans için generics ve etkili algoritmalar kullanmak, LINQ ile büyük koleksiyonları yönetmek önemlidir. Debugging için interface referansları testlerde ve mock objelerde avantaj sağlar. Güvenlik için giriş doğrulamaları ve istisna yönetimi uygulanmalıdır. Bu uygulamalar modüler, yeniden kullanılabilir ve güvenli kod üretmeyi sağlar.
📊 Referans Tablosu
C# Element/Concept | Description | Usage Example |
---|---|---|
Interface | Sınıfların uygulaması gereken sözleşmeyi tanımlar | interface IShape { double CalculateArea(); } |
Implementation | Sınıf arayüzü uygular | class Rectangle : IShape { public double CalculateArea() { return Width*Height; } } |
Polymorphism | Farklı tipleri arayüz üzerinden işlemek | IShape shape = new Rectangle(5,10); double area = shape.CalculateArea(); |
Properties in Interface | Arayüzde özellik tanımlama | interface IShape { string Name { get; } } |
Error Handling | Arayüz nesnelerinde hata yönetimi | if(shape==null) throw new ArgumentNullException(nameof(shape)); |
Arayüzleri öğrenmek, kodda açık sözleşmeler tanımlamayı ve polimorfizm uygulamayı sağlar, böylece sistemler esnek ve sürdürülebilir olur. Sonraki adımlar olarak Strategy ve Factory gibi tasarım desenlerini ve SOLID prensiplerini incelemek önerilir. Pratikte, farklı davranışlar için birden fazla arayüz oluşturup projelerde entegre etmek, öğrenilen bilgilerin pekişmesini sağlar. Ek kaynaklar arasında Microsoft belgeleri, ileri seviye C# eğitimleri ve açık kaynak projeler bulunur.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu konudaki anlayışınızı pratik sorularla test edin.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek