Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tavsiye
Yazılım geliştirme konusunda yeni misiniz? İlk olarak Başlangıç öğreticileri ile başlayın. İlişkili olmayan türlerde paylaşılan davranışı tanımlamanız gerektiğinde arabirimlerle karşılaşırsınız.
Başka bir dilde mi deneyimlisiniz? C# arabirimleri, Java arabirimlerine veya Swift'teki protokollere benzer. C#'ye özgü desenleri bulmak için açık uygulama bölümüne göz atın.
Arabirim bir sözleşmeyi tanımlar: class veya struct tarafından uygulanması gereken ilgili yöntemler, özellikler, olaylar ve dizin oluşturuculardan oluşan bir gruptur. Arabirimler tek bir türün birden çok sözleşme uygulamasına izin verir. Bu, C# sınıfların birden çok devralmayı desteklemediğinden önemlidir. Yapılar diğer yapılardan veya sınıflardan devralamaz, bu nedenle yapı türleri arasında paylaşılan davranış eklemenin tek yolu arabirimlerdir.
Aşağıdaki örnekte bir arabirim ve bunu uygulayan bir sınıf bildirmektedir:
interface IEquatable<T>
{
bool Equals(T obj);
}
public class Car : IEquatable<Car>
{
public string? Make { get; set; }
public string? Model { get; set; }
public string? Year { get; set; }
public bool Equals(Car? car) =>
car is not null &&
(Make, Model, Year) == (car.Make, car.Model, car.Year);
}
Uygulayan IEquatable<T> herhangi bir sınıf veya yapı, arabirim imzası ile eşleşen bir Equals yöntem sağlamalıdır. Somut türden bağımsız olarak eşitlik karşılaştırmasını desteklemek için herhangi bir IEquatable<T> uygulamaya güvenebilirsiniz. Bu tahmin edilebilirlik, arabirimlerin temel değeridir.
Arayüz tanımlamak
anahtar sözcüğüyle interface bir arabirim tanımlayın. Kural gereği, arabirim adları büyük Iharfle başlar:
interface ILogger
{
void Log(string message);
string Name { get; }
}
Arabirimler yöntemler, özellikler, olaylar ve dizin oluşturucular içerebilir. Arabirim örnek alanları, örnek oluşturucuları veya sonlandırıcılar içeremez. Üyeler varsayılan olarak public olur. Gerektiğinde diğer erişilebilirlik değiştiricilerini belirtebilirsiniz. Örneğin, derlemenin dışında görünmemesi gereken üyeler için kullanın internal .
Arabirim uygulamak
Bir sınıf veya yapı, bildiriminde iki nokta üst üsteden sonra uyguladığı arabirimleri listeler. sınıfı, arabirimde bildirilen her üye için bir uygulama sağlamalıdır:
public class ConsoleLogger : ILogger
{
public string Name => "Console";
public void Log(string message) =>
Console.WriteLine($"[{Name}] {message}");
}
public class FileLogger : ILogger
{
public string Name => "File";
public void Log(string message)
{
// In a real app, write to a file
Console.WriteLine($"[{Name}] Writing to file: {message}");
}
}
Bir sınıf, virgülle ayrılmış birden çok arabirim uygulayabilir. Listelediğinden her arabirimdeki tüm üyeler için uygulamalar sağlamalıdır.
Açık uygulama
Bazen bir arabirim üyesini sınıfın genel API'sinin parçası yapmadan uygulamanız gerekir. Açık uygulama üyeyi arabirim adıyla birlikte tanımlar. Üyeye yalnızca arabirim türündeki bir değişken aracılığıyla erişilebilir:
interface IMetric
{
double GetDistance(); // Returns meters
}
interface IImperial
{
double GetDistance(); // Returns feet
}
public class Runway(double meters) : IMetric, IImperial
{
// Explicit implementation for IMetric
double IMetric.GetDistance() => meters;
// Explicit implementation for IImperial
double IImperial.GetDistance() => meters * 3.28084;
}
Açık uygulama, iki arabirim aynı ada sahip üyeleri bildirdiğinde veya sınıfın genel yüzeyini temiz tutmak istediğinizde kullanışlıdır. Daha fazla ayrıntı için bkz. Açık Arabirim Uygulaması.
Arayüz Kalıtımı
Arabirimler bir veya daha fazla arabirimden devralabilir. Türetilmiş arabirim uygulayan bir sınıf, türetilmiş arabirimdeki tüm üyeleri ve tüm temel arabirimlerini uygulamalıdır:
interface IDrawable
{
void Draw();
}
interface IShape : IDrawable
{
double Area { get; }
}
public class Circle(double radius) : IShape
{
public double Area => Math.PI * radius * radius;
public void Draw() =>
Console.WriteLine($"Drawing circle with area {Area:F2}");
}
Bir sınıf, IShape'ü uyguladığında, IShape'nin ondan türemiş olması nedeniyle örtük olarak IDrawable'e dönüştürülebilir.
Arabirimler ile soyut sınıflar karşılaştırması
Hem arabirimler hem de soyut sınıflar türetilmiş türlerin yerine getirmesi gereken sözleşmeleri tanımlar.
- İlişkili türler durumu (alanları), oluşturucuları veya genel olmayan üyeleri paylaştığında soyut bir sınıf kullanın. Soyut sınıflar, mevcut türetilmiş türleri bozmadan varsayılan davranışa sahip yeni üyeler ekleyerek hiyerarşiyi geliştirmenize olanak verir.
- Bir türün ilişkisiz hiyerarşileri kesen bir sözleşmeyi yerine getirmesi gerektiğinde veya birden çok sözleşme uygulaması gerektiğinde arabirim kullanın. Arabirimler örnek alanlarını veya oluşturucuları bildiremez, bu nedenle zaten bir temel sınıfı olan türlere özellik eklemek için en uygun seçenektir. Gelişmiş senaryolar için, arabirimler varsayılan üye uygulamalarını da destekler.
Bir sınıf yalnızca bir temel sınıftan devralabilir ancak birden çok arabirim uygulayabilir. Bu ayrım genellikle arabirimleri tür hiyerarşileri arasında kesen özellikleri tanımlamak için daha iyi bir seçenek haline getirir.
İç arabirimlerle çalışma
Genellikle, arayüz imzasında yer alan tüm türler herkese açık olduğu sürece, herkesçe erişilebilir üyelere sahip bir iç arayüz uygulayabilirsiniz. Bir arabirim, üye imzalarında iç türler kullandığında, uygulayan üye iç türleri kullanıma sunarken public olamayacağından açık uygulama yapmanız gerekir:
internal class InternalConfiguration
{
public string Setting { get; set; } = "";
}
internal interface ILoggable
{
void Log(string message);
}
internal interface IConfigurable
{
void Configure(InternalConfiguration config);
}
public class ServiceImplementation : ILoggable, IConfigurable
{
// Implicit implementation: ILoggable uses only public types in its signature
public void Log(string message) =>
Console.WriteLine($"Log: {message}");
// Explicit implementation: IConfigurable uses internal types
void IConfigurable.Configure(InternalConfiguration config) =>
Console.WriteLine($"Configured with: {config.Setting}");
}
Yukarıdaki örnekte, IConfigurable yöntem imzasında bir iç tür InternalConfiguration kullanır.
ServiceImplementation bu üye için açık uygulama kullanır. Buna karşılık, ILoggable imzasında yalnızca genel türleri (string) kullanır ve örtük olarak uygulanabilir.
Varsayılan arabirim üyeleri ve statik soyut üyeler
Arabirimler, temel sözleşmelerin ötesine geçebilecek iki gelişmiş özelliği destekler:
- Varsayılan arabirim üyeleri , bir arabirimin bir yöntem gövdesi sağlamasına izin verir. Tür uygulamaları varsayılan uygulamayı devralır ve isteğe bağlı olarak geçersiz kılabilir. Daha fazla bilgi için bkz . varsayılan arabirim yöntemleri.
- Statik soyut üyeler , statik üye sağlamak için türlerin uygulanmasını gerektirir. Bu, işleç sözleşmelerini veya fabrika desenlerini tanımlamak için kullanışlıdır. Daha fazla bilgi için bkz. Arabirimlerdeki statik soyut üyeler.
Her iki özellik de dil referansındaki arabirimler ile ilgili makalede ele alınmıştır. Günlük arabirim kullanımının çoğu, bu makalenin önceki bölümlerinde açıklanan desenleri bildirmeyi ve uygulamayı içerir.
Arabirimler özeti
- Arabirim yöntemler, özellikler, olaylar ve dizin oluşturucuların sözleşmesini tanımlar.
- Arabirim uygulayan bir sınıf veya yapı, bildirilen tüm üyeler için uygulamalar sağlamalıdır (arabirim varsayılan bir uygulama sağlamadığı sürece).
- Doğrudan arabirim örneği oluşturamazsınız.
- Bir sınıf veya yapı birden çok arabirim uygulayabilir. Bir sınıf bir temel sınıfı devralabilir ve ayrıca bir veya daha fazla arabirim uygulayabilir.
- Arabirim adları geleneksel olarak ile
Ibaşlar.