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.
Arabirim, soyut class olmayan veya struct uygulaması gereken ilgili işlevler grubunun tanımlarını içerir. Bir arayüz static yöntemler tanımlayabilir. Arabirim, üyeler için varsayılan bir uygulama tanımlayabilir. Arabirim alanlar, otomatik olarak uygulanan özellikler veya özellik benzeri olaylar gibi örnek verilerini bildiremez.
Örneğin, arabirimleri kullanarak bir sınıftaki birden çok kaynaktan gelen davranışı ekleyebilirsiniz. Dil, sınıfların birden çok devralma özelliğini desteklemediğinden bu özellik C# dilinde önemlidir. Ayrıca, yapıların devralma benzetimini yapmak istiyorsanız bir arabirim kullanmanız gerekir çünkü bunlar başka bir yapıdan veya sınıftan devralamaz.
Aşağıdaki örnekte gösterildiği gibi anahtar sözcüğünü interface kullanarak bir arabirim tanımlarsınız.
interface IEquatable<T>
{
bool Equals(T obj);
}
Arabirimin adı geçerli bir C# tanımlayıcı adı olmalıdır. Kural gereği, arabirim adları büyük Iile başlar.
Arabirimi uygulayan herhangi bir sınıf veya yapı, arabirimin IEquatable<T> belirttiği imzayla eşleşen bir Equals yöntemin tanımını içermelidir. Sonuç olarak, bu sınıfın bir örneğinin aynı sınıfın T başka bir örneğine eşit olup olmadığını belirleyebileceği bir IEquatable<T> yöntem içerecek şekilde uygulayan Equals bir tür sınıfına güvenebilirsiniz.
tanımı IEquatable<T> için Equalsbir uygulama sağlamaz. Bir sınıf veya yapı birden çok arabirim uygulayabilir, ancak bir sınıf yalnızca tek bir sınıftan devralabilir.
Soyut sınıflar hakkında daha fazla bilgi için bkz . Soyut ve Korumalı Sınıflar ve Sınıf Üyeleri.
Arabirimler örnek yöntemleri, özellikler, olaylar, dizin oluşturucular veya bu dört üye türünün herhangi bir bileşimini içerebilir. Arabirimler statik oluşturucular, alanlar, sabitler veya işleçler içerebilir. Alan olmayan arabirim üyeleri static abstract olabilir. Arabirim örnek alanları, örnek oluşturucuları veya sonlandırıcılar içeremez. Arabirim üyeleri varsayılan olarak geneldir ve , public, , protected, internal, privateveya protected internalgibi private protectederişilebilirlik değiştiricilerini açıkça belirtebilirsiniz. Bir private üyenin varsayılan uygulaması olmalıdır.
Örtük uygulama kullanarak bir arabirim üyesi uygulamak için, uygulayan sınıfın ilgili üyesi genel, statik olmayan ve arabirim üyesiyle aynı ada ve imzaya sahip olmalıdır. Ortak olması amaçlanmayan arabirim üyelerini uygulamak için açık arabirim uygulamasını kullanmanız gerekir.
Not
Bir arabirim statik üyeler bildirdiğinde, bu arabirimi uygulayan bir tür de aynı imzaya sahip statik üyeler bildirebilir. Bu üyeler ayrıdır ve üyeyi belirten tür tarafından benzersiz olarak tanımlanır. Bir tür içinde bildirilen statik üye, arabirimde bildirilen statik üyeyi geçersiz kılmaz .
Arabirim uygulayan bir sınıf veya yapı, arabirim tarafından sağlanan varsayılan bir uygulama olmadan bildirilen tüm üyeler için bir uygulama sağlamalıdır. Ancak, bir temel sınıf bir arabirim uygularsa, temel sınıftan türetilen tüm sınıflar bu uygulamayı devralır.
Aşağıdaki örnekte arabiriminin bir uygulaması gösterilmektedir IEquatable<T> . uygulayan sınıfı, Caryönteminin Equals bir uygulamasını sağlamalıdır.
public class Car : IEquatable<Car>
{
public string? Make { get; set; }
public string? Model { get; set; }
public string? Year { get; set; }
// Implementation of IEquatable<T> interface
public bool Equals(Car? car)
{
return (this.Make, this.Model, this.Year) ==
(car?.Make, car?.Model, car?.Year);
}
}
Bir sınıfın özellikleri ve dizin oluşturucuları, arabirimde bildirilen bir özellik veya dizin oluşturucu için ek erişimciler tanımlayabilir. Örneğin, bir arabirim get erişimcisi olan bir özellik bildirebilir. arabirimini uygulayan sınıf, hem hem getde küme erişimcisiyle aynı özelliği bildirebilir. Ancak, özellik veya dizin oluşturucu açık uygulama kullanıyorsa, erişimcilerin eşleşmesi gerekir. Açık uygulama hakkında daha fazla bilgi için bkz . Açık Arabirim Uygulaması ve Arabirim Özellikleri.
Arabirimler bir veya daha fazla arabirimden devralabilir. Türetilmiş arabirim, üyeleri temel arabirimlerinden devralır. Türetilmiş arabirim uygulayan bir sınıf, türetilmiş arabirimin temel arabirimlerinin tüm üyeleri dahil olmak üzere türetilmiş arabirimdeki tüm üyeleri uygulamalıdır. Bu sınıf örtük olarak türetilmiş arabirime veya temel arabirimlerinden herhangi birine dönüştürülebilir. Bir sınıf, devraldığı temel sınıflar aracılığıyla veya diğer arabirimlerin devraldığı arabirimler aracılığıyla bir arabirimi birden çok kez içerebilir. Ancak, sınıfı bir arabirimin yalnızca bir kez ve yalnızca sınıfın arabirimini sınıfın (class ClassName : InterfaceName) tanımının bir parçası olarak bildirdiği bir uygulama sağlayabilir. Arabirimi uygulayan bir temel sınıfı devraldığınız için arabirim devralınırsa, temel sınıf arabirimin üyelerinin uygulamasını sağlar. Ancak türetilmiş sınıf, devralınan uygulamayı kullanmak yerine tüm sanal arabirim üyelerini yeniden canlandırabilir. Arabirimler bir yöntemin varsayılan uygulamasını bildirdiğinde, bu arabirimi uygulayan tüm sınıflar bu uygulamayı devralır (Arabirim üyesindeki varsayılan uygulamaya erişmek için sınıf örneğini arabirim türüne atamanız gerekir).
Temel sınıf, sanal üyeleri kullanarak arabirim üyelerini de uygulayabilir. Bu durumda, türetilmiş bir sınıf, sanal üyeleri geçersiz kılarak arabirim davranışını değiştirebilir. Sanal üyeler hakkında daha fazla bilgi için bkz . Çok biçimlilik.
İç arabirimlerle çalışma
Arabirim imzasında yer alan tüm türler genel olarak erişilebilir olduğu sürece iç arabirim genellikle ortak üyeler ile örtük uygulama kullanılarak uygulanabilir. Ancak, bir arabirim üye imzalarında iç türler kullandığında, uygulayan sınıf üyesinin iç türleri kullanıma sunarken genel olması gerekeceğinden örtük uygulama imkansız hale gelir. Böyle durumlarda, açık arabirim uygulamasını kullanmanız gerekir.
Aşağıdaki örnekte her iki senaryo da gösterilmektedir:
// Internal type that cannot be exposed publicly
internal class InternalConfiguration
{
public string Setting { get; set; } = "";
}
// Internal interface that CAN be implemented with public members
// because it only uses public types in its signature
internal interface ILoggable
{
void Log(string message); // string is public, so this works with implicit implementation
}
// Interface with internal accessibility using internal types
internal interface IConfigurable
{
void Configure(InternalConfiguration config); // Internal type prevents implicit implementation
}
// This class shows both implicit and explicit interface implementation
public class ServiceImplementation : ILoggable, IConfigurable
{
// Implicit implementation works for ILoggable because string is public
public void Log(string message)
{
Console.WriteLine($"Log: {message}");
}
// Explicit implementation required for IConfigurable because it uses internal types
void IConfigurable.Configure(InternalConfiguration config)
{
// Implementation here
Console.WriteLine($"Configured with: {config.Setting}");
}
// If we tried implicit implementation for IConfigurable, this wouldn't compile:
// public void Configure(InternalConfiguration config) // Error: cannot expose internal type
}
Yukarıdaki örnekte arabirim, IConfigurable yöntem imzasında bir iç tür InternalConfiguration kullanır. Sınıf ServiceImplementation, yöntem imzası iç türler içerdiğinde Configure yönteminin herkese açık olması gerekeceği için örtük uygulamayı kullanamaz. Bunun yerine, erişim değiştiricisi olmayan ve yalnızca arabirim türü aracılığıyla erişilebilen açık arabirim uygulaması kullanılır.
Buna karşılık, arabirimin ILoggable kendisi iç olsa bile, imzası (string) içindeki tüm türler genel olarak erişilebilir olduğundan, arabirim ortak üyeler ile örtük olarak uygulanabilir.
Açık arabirim uygulaması hakkında daha fazla bilgi için bkz. Açık Arabirim Uygulaması.
Arabirimler özeti
Arabirim aşağıdaki özelliklere sahiptir:
- 8.0'dan önceki C# sürümlerinde arabirim, yalnızca soyut üyeleri olan soyut bir temel sınıf gibidir. Arabirimi uygulayan bir sınıf veya yapı tüm üyelerini uygulamalıdır.
- C# 8.0 sürümünden başlayarak, bir arabirim üyelerinden bazıları veya tümü için varsayılan uygulamaları tanımlayabilir. Arabirimi uygulayan bir sınıf veya yapının varsayılan uygulamaları olan üyeleri uygulaması gerekmez. Daha fazla bilgi için bkz . varsayılan arabirim yöntemleri.
- Arabirim doğrudan örneklenemez.
- 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.