Aracılığıyla paylaş


18 Arabirim

18.1 Genel

Arabirim bir sözleşme tanımlar. Arabirim uygulayan bir sınıf veya yapı, sözleşmesine uymalıdır. Bir arabirim birden çok temel arabirimden devralabilir ve bir sınıf veya yapı birden çok arabirim uygulayabilir.

Arabirimler yöntemler, özellikler, olaylar ve dizin oluşturucular içerebilir. Arabirimin kendisi, bildirdiği üyeler için uygulama sağlamaz. Arabirim yalnızca arabirimi uygulayan sınıflar veya yapılar tarafından sağlanacak üyeleri belirtir.

18.2 Arabirim bildirimleri

18.2.1 Genel

interface_declaration, yeni bir arabirim türü bildiren bir type_declaration (§14.7) olur.

interface_declaration
    : attributes? interface_modifier* 'partial'? 'interface'
      identifier variant_type_parameter_list? interface_base?
      type_parameter_constraints_clause* interface_body ';'?
    ;

Bir interface_declaration, isteğe bağlı bir öznitelik kümesi (§22), ardından isteğe bağlı bir interface_modifier kümesi (§18.2.2), ardından isteğe bağlı bir kısmi değiştirici (§15.2.7), ardından anahtar sözcük interface ve arabirimi adlandıran bir tanımlayıcı, ardından isteğe bağlı bir variant_type_parameter_list belirtimi (§18.2.3), ardından isteğe bağlı bir interface_base belirtimi (§18.2.4), ardından isteğe bağlı bir type_parameter_constraints_clause belirtimi (§15.2.5), ardından bir interface_body (§18.3) ve isteğe bağlı olarak bir noktalı virgülden oluşur.

variant_type_parameter_listsağlanmadıkça, bir arabirim bildirimi type_parameter_constraints_clausesağlamamalıdır.

variant_type_parameter_list sağlayan bir arabirim bildirimi, genel bir arabirim bildirimidir. Ayrıca, genel bir sınıf bildiriminin veya genel bir yapı bildiriminin içinde yer alan herhangi bir arabirim, kendiliğinden genel bir arabirim bildirimidir, çünkü içeren türün tür bağımsız değişkenleri, oluşturulacak türü oluşturmak için sağlanmalıdır (§8.4).

18.2.2 Arabirim değiştiricileri

bir interface_declaration isteğe bağlı olarak bir dizi arabirim değiştirici içerebilir:

interface_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    | unsafe_modifier   // unsafe code support
    ;

unsafe_modifier (§23.2) yalnızca güvenli olmayan kodda (§23) kullanılabilir.

Aynı değiştiricinin bir arabirim bildiriminde birden çok kez görünmesi bir derleme zamanı hatasıdır.

new Değiştiriciye yalnızca bir sınıf içinde tanımlanan arabirimlerde izin verilir. Arabirimin, §15.3.5'te açıklandığı gibi, devralınan bir üyeyi aynı isimle gizlediğini belirtir.

public, protected, internalve private değiştiricileri arabirimin erişilebilirliğini denetler. Arabirim bildiriminin gerçekleştiği bağlama bağlı olarak, bu değiştiricilerin yalnızca bazılarına izin verilebileceği (§7.5.2). Kısmi tür bildirimi (§15.2.7) bir erişilebilirlik belirtimi içerdiğinde (, public, protectedve internal değiştiricileri aracılığıylaprivate), §15.2.2'deki kurallar geçerlidir.

18.2.3 Değişken türü parametre listeleri

18.2.3.1 Genel

Değişken türü parametre listeleri yalnızca arabirim ve temsilci türlerinde oluşabilir. Sıradan type_parameter_list'lerin farkı, her tür parametresindeki isteğe bağlı variance_annotation'dır.

variant_type_parameter_list
    : '<' variant_type_parameter (',' variant_type_parameter)* '>'
    ;

variant_type_parameter
    : attributes? variance_annotation? type_parameter
    ;

variance_annotation
    : 'in'
    | 'out'
    ;

Varyans ek açıklaması out olduğunda, tür parametresinin birlikte değişken olduğu söylenir. Varyans açıklaması in ise, tür parametresinin kontravaryant olduğu söylenir. Varyans ek açıklaması yoksa tür parametresinin sabit olduğu söylenir.

Örnek: Aşağıdakilerde:

interface C<out X, in Y, Z>
{
    X M(Y y);
    Z P { get; set; }
}

X kovaryant, Y kontravariant ve Z sabittir.

son örnek

Genel bir arabirim birden çok bölümde (§15.2.3) bildirilirse, her kısmi bildirim her tür parametresi için aynı varyansı belirtecektir.

18.2.3.2 Varyans güvenliği

Türün tür parametre listesinde varyans ek açıklamalarının oluşumu, tür bildiriminde türlerin oluşabileceği yerleri kısıtlar.

Aşağıdakilerden biri barındırılıyorsa, T türü çıkış güvensizdir:

  • T değişken karşıtı bir tür parametresidir
  • T çıktı için güvensiz öğe türüne sahip bir dizi türüdür
  • T, aşağıdakilerden en az birinin Sᵢ,... Aₑ tutulduğu genel bir türden oluşturulan bir arabirim veya temsilci türüdür:S<Xᵢ, ... Xₑ>Aᵢ
    • Xᵢ kovaryant veya invaryanttır ve Aᵢ çıkış açısından güvensizdir.
    • Xᵢ değişken veya sabittir ve Aᵢ girişe güvenli değildir.

Aşağıdakilerden biri barındırılıyorsa , T türü girişi güvenli değildir:

  • T ortak değişken türünde bir parametredir
  • T giriş-güvensiz öğe türüne sahip bir dizi türüdür
  • T, aşağıdakilerden en az birinin S<Aᵢ,... Aₑ> tutulduğu genel bir türden oluşturulan bir arabirim veya temsilci türüdür:S<Xᵢ, ... Xₑ>Aᵢ
    • Xᵢ kovaryant veya sabittir ve Aᵢ giriş açısından güvensizdir.
    • Xᵢ kontravaryant veya invaryanttır ve Aᵢ çıkış-güvensizdir.

Sezgisel olarak, çıkış konumunda güvenli olmayan bir çıkış türü yasaktır ve giriş konumunda güvenli olmayan giriş türü yasaktır.

Bir tür çıkış-güvenli ise çıkış-güvensiz değildir ve giriş-güvenli ise giriş-güvensiz değildir.

18.2.3.3 Varyans dönüştürme

Varyans anotasyonlarının amacı, arabirim ve temsilci türlerine daha esnek (ancak yine de tür güvenli) dönüşümler sağlamaktır. Bu amaçla örtük (§10.2) ve açık dönüştürme (§10.3) tanımları, aşağıdaki gibi tanımlanan varyans-dönüştürülebilirlik kavramını kullanır:

Bir tür T<Aᵢ, ..., Aᵥ>, değişken tür parametreleri T<Bᵢ, ..., Bᵥ> ile ilan edilmiş T bir arabirim veya temsilci türüyse ve her değişken tür parametresi T<Xᵢ, ..., Xᵥ> için aşağıdakilerden biri geçerliyse, Xᵢ türüne değişkenlikle dönüştürülebilir.

  • Xᵢ kovaryanttır ve Aᵢ'den Bᵢ'ye örtük bir referans veya kimlik dönüştürmesi vardır.
  • Xᵢ kontravaryanttır ve Bᵢ'den Aᵢ'ye örtük bir başvuru veya kimlik dönüştürmesi vardır.
  • Xᵢ sabittir ve Aᵢ ile Bᵢ arasında bir kimlik dönüştürmesi vardır.

18.2.4 Temel arabirimler

Bir arabirim, arabirimin açık temel arabirimleri olarak adlandırılan sıfır veya daha fazla arabirim türünden devralabilir. Bir arabirimde bir veya daha fazla açık temel arabirim olduğunda, bu arabirimin bildiriminde arabirim tanımlayıcısını iki nokta üst üste ve virgülle ayrılmış temel arabirim türlerinin listesi izler.

interface_base
    : ':' interface_type_list
    ;

Açık temel arabirimler arabirim türleri (§8.4, §18.2) oluşturulabilir. Temel arabirim kendi başına bir tür parametresi olamaz, ancak kapsamdaki tür parametrelerini içerebilir.

Oluşturulmuş bir arabirim türü için, açık temel arabirimler, genel tür tanımındaki açık temel arabirim bildirimlerindekileri alarak ve her bir temel arabirim bildirimindeki type_parameter yerine, oluşturulmuş türün karşılık gelen type_argument ile değiştirerek oluşturulur.

Bir arabirimin açık taban arabirimleri en az arabirimin kendisi kadar erişilebilir olmalıdır (§7.5.5).

Not: Örneğin, bir private arabiriminin internal kısmında bir veya public arabirimini belirtmek bir derleme zamanı hatasıdır. son not

Bir arabirimin doğrudan veya dolaylı olarak kendisinden devralması derleme zamanı hatasıdır.

Bir arabirimin temel arabirimleri açık temel arabirimler ve bunların temel arabirimleridir. Başka bir deyişle, temel arabirim kümesi, açık temel arabirimlerin, bunların açık temel arabirimlerinin vb. tam geçişli kapanışıdır. Arabirim, temel arabirimlerinin tüm üyelerini devralır.

Örnek: Aşağıdaki kodda

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

interface IListBox : IControl
{
    void SetItems(string[] items);
}

interface IComboBox: ITextBox, IListBox {}

temel arabirimleri IComboBox , IControlve ITextBoxşeklindedirIListBox. Başka bir deyişle, yukarıdaki IComboBox arabirimi SetText, SetItems ve Paint gibi üyeleri devralır.

son örnek

Oluşturulmuş bir genel türden devralınan üyeler, tür değiştirme işleminden sonra devralınır. Diğer bir ifadeyle, üyedeki tüm bileşen türlerinde, temel sınıf bildiriminin tür parametrelerinin yerine class_base belirtiminde kullanılan ilgili tür bağımsız değişkenleri kullanılır.

Örnek: Aşağıdaki kodda

interface IBase<T>
{
    T[] Combine(T a, T b);
}

interface IDerived : IBase<string[,]>
{
    // Inherited: string[][,] Combine(string[,] a, string[,] b);
}

Tür parametresi IDerived ile Combine değiştirildikten sonra arabirim, T arayüzünü devralır ve string[,] yöntemini uygular.

son örnek

Arabirim uygulayan bir sınıf veya yapı, arabirimin tüm temel arabirimlerini de örtük olarak uygular.

Kısmi arabirim bildiriminin (§15.2.7) birden çok parçasındaki arabirimlerin işlenmesi ,15.2.4.3'te daha ayrıntılı olarak ele alınıyor.

Bir arabirimin her temel arabirimi çıkış açısından güvenli olmalıdır (§18.2.3.2).

18.3 Arabirim gövdesi

Arabirimin interface_body , arabirimin üyelerini tanımlar.

interface_body
    : '{' interface_member_declaration* '}'
    ;

18.4 Arabirim üyeleri

18.4.1 Genel

Bir arabirimin üyeleri, temel arabirimlerden devralınan üyeler ve arabirimin kendisi tarafından bildirilen üyelerdir.

interface_member_declaration
    : interface_method_declaration
    | interface_property_declaration
    | interface_event_declaration
    | interface_indexer_declaration
    ;

Arabirim bildirimi sıfır veya daha fazla üye bildirir. Bir arabirimin üyeleri yöntemler, özellikler, olaylar veya dizin oluşturucular olmalıdır. Arabirim sabitler, alanlar, işleçler, örnek oluşturucuları, sonlandırıcılar veya türler içeremez veya herhangi bir türdeki statik üyeleri içeremez.

Tüm arabirim üyeleri örtük olarak genel erişime sahiptir. Arabirim üyesi bildirimlerinin değiştiricileri içermesi derleme zamanında bir hatadır.

interface_declaration yeni bir bildirim alanı (§7.3) oluşturur ve interface_declaration hemen içerdiği tür parametreleri ve interface_member_declaration bu bildirim alanına yeni üyeler ekler. Aşağıdaki kurallar interface_member_declarationiçin geçerlidir:

  • Bir arabirim bildiriminin variant_type_parameter_list bir tür parametresinin adı, aynı variant_type_parameter_list diğer tüm tür parametrelerinin adlarından farklı olmalıdır ve arabirimin tüm üyelerinin adlarından farklıdır.
  • Bir yöntemin adı, aynı arabirimde bildirilen tüm özelliklerin ve olayların adlarından farklı olmalıdır. Ayrıca, bir yöntemin imzası (§7.6) aynı arabirimde bildirilen diğer tüm yöntemlerin imzalarından farklı olacaktır ve aynı arabirimde bildirilen iki yöntem yalnızca , inve outile reffarklı imzalara sahip olmayacaktır.
  • Bir özelliğin veya olayın adı, aynı arabirimde bildirilen diğer tüm üyelerin adlarından farklı olacaktır.
  • Bir dizin oluşturucunun imzası, aynı arabirimde bildirilen diğer tüm dizin oluşturucuların imzalarından farklı olmalıdır.

Bir arabirimin devralınan üyeleri, özellikle arabirimin bildirim alanının bir parçası değildir. Bu nedenle, bir arabirimin devralınan üyeyle aynı ada veya imzaya sahip bir üyeyi tanımlamasına izin verilir. Bu durum oluştuğunda, türetilmiş arabirim üyesinin temel arabirim üyesini gizley dediği söylenir. Devralınan bir üyenin gizlenmesi hata olarak kabul edilmez, ancak derleyicinin uyarı vermesine neden olur. Uyarıyı bastırmak için, türetilmiş arabirim üyesinin bildiriminde, türetilen üyenin temel üyeyi gizlemeye yönelik olduğunu belirten bir new değiştirici bulunacaktır. Bu konu §7.7.2.3'te daha ayrıntılı olarak ele alınmıştır.

Devralınan bir new üyeyi gizlemeyen bir bildirime değiştirici eklenirse, bu durumla ilgili bir uyarı verilir. Bu uyarı, değiştirici kaldırılarak bastırılırnew.

Not: Sınıftaki object üyeler hiçbir arabirimin (§18.4) üyesi değildir. Ancak, sınıftaki object üyeler herhangi bir arabirim türünde (§12.5) üye arama yoluyla kullanılabilir. son not

Birden çok bölümde bildirilen bir arabirimin üyeleri kümesi (§15.2.7), her bölümde bildirilen üyelerin birleşimidir. Arabirim bildiriminin tüm bölümlerinin gövdeleri aynı bildirim alanını (§7.3) paylaşır ve her üyenin (§7.7) kapsamı tüm parçaların gövdelerine kadar uzanır.

18.4.2 Arabirim yöntemleri

Arabirim yöntemleri interface_method_declarationkullanılarak bildirilir:

interface_method_declaration
    : attributes? 'new'? return_type interface_method_header
    | attributes? 'new'? ref_kind ref_return_type interface_method_header
    ;

interface_method_header
    : identifier '(' parameter_list? ')' ';'
    | identifier type_parameter_list '(' parameter_list? ')'
      type_parameter_constraints_clause* ';'
    ;

Arabirim yöntemi bildiriminin öznitelikleri, return_type, ref_return_type, tanımlayıcısı ve parameter_list , bir sınıftaki yöntem bildiriminin (§15.6) anlamlarıyla aynı anlama sahiptir. Arabirim yöntemi bildiriminin bir yöntem gövdesi belirtmesine izin verilmez ve bu nedenle bildirim her zaman noktalı virgülle biter.

Bir arabirim yönteminin tüm parametre türleri giriş-güvenli (§18.2.3.2) ve dönüş türü ya da void çıkış-güvenli olmalıdır. Ayrıca, tüm çıkış veya başvuru parametre türleri de çıkış açısından güvenli olmalıdır.

Not: Yaygın uygulama kısıtlamaları nedeniyle çıkış parametrelerinin giriş açısından güvenli olması gerekir. son not

Ayrıca, yöntemin herhangi bir tür parametresinde her sınıf türü kısıtlaması, arabirim türü kısıtlaması ve tür parametresi kısıtlaması giriş açısından güvenli olacaktır.

Ayrıca, yöntemin herhangi bir tür parametresindeki her sınıf türü kısıtlaması, arabirim türü kısıtlaması ve tür parametresi kısıtlaması giriş açısından güvenli olacaktır.

Bu kurallar, arabirimin herhangi bir kovaryant veya kontravaryant kullanımının tür güvenliğini korumasını sağlar.

Örnek:

interface I<out T>
{
    void M<U>() where U : T;     // Error
}

T üzerinde tür parametresi kısıtlaması olarak U kullanımının giriş açısından güvenli olmaması nedeniyle yanlış biçimlendirilmiştir.

Bu kısıtlamanın yapılmaması durumunda tür güvenliğini aşağıdaki şekilde ihlal etmek mümkün olacaktır:

class B {}
class D : B {}
class E : B {}
class C : I<D>
{
    public void M<U>() {...} 
}

...

I<B> b = new C();
b.M<E>();

Aslında bu, C.M<E> için bir çağrıdır. Ancak bu çağrının yapılabilmesi için E'nin D'den türetilmesi gerektiğinden, tür güvenliği burada ihlal edilir.

son örnek

18.4.3 Arabirim özellikleri

Arabirim özellikleri interface_property_declarationkullanılarak bildirilir:

interface_property_declaration
    : attributes? 'new'? type identifier '{' interface_accessors '}'
    | attributes? 'new'? ref_kind type identifier '{' ref_interface_accessor '}'
    ;

interface_accessors
    : attributes? 'get' ';'
    | attributes? 'set' ';'
    | attributes? 'get' ';' attributes? 'set' ';'
    | attributes? 'set' ';' attributes? 'get' ';'
    ;

ref_interface_accessor
    : attributes? 'get' ';'
    ;

Arabirim özellik bildiriminin öznitelikleri, türü ve tanımlayıcısı , bir sınıftaki (§15.7) özellik bildiriminin anlamlarıyla aynı anlama sahiptir.

Arabirim özellik bildiriminin erişimcileri, §15.7.3’teki sınıf özellik bildiriminin erişimcilerine karşılık gelir, ancak accessor_body daima bir noktalı virgül olmalıdır. Bu nedenle, erişimciler özelliğin okuma-yazma, salt okunur veya sadece yazılabilir olduğunu gösterir.

Bir arabirim özelliğinin türü, bir get erişimcisi varsa çıkış-güvenli olmalı ve bir set erişimcisi varsa giriş-güvenli olmalıdır.

18.4.4 Arabirim olayları

Arabirim olayları interface_event_declarationkullanılarak bildirilir:

interface_event_declaration
    : attributes? 'new'? 'event' type identifier ';'
    ;

Arabirim olay bildiriminin öznitelikleri, türü ve tanımlayıcısı , bir sınıftaki olay bildiriminin (§15.8) anlamlarıyla aynı anlama sahiptir.

Bir arabirim olayının türü giriş açısından güvenli olmalıdır.

18.4.5 Arabirim dizin oluşturucuları

Arabirim dizinleyicileri interface_indexer_declaration kullanılarak bildirilir.

interface_indexer_declaration
    : attributes? 'new'? type 'this' '[' parameter_list ']'
      '{' interface_accessors '}'
    | attributes? 'new'? ref_kind type 'this' '[' parameter_list ']'
      '{' ref_interface_accessor '}'
    ;

Arabirim dizin oluşturucu bildiriminin öznitelikleri, türü ve parameter_list , bir sınıftaki dizin oluşturucu bildirimiyle (§15.9) aynı anlama sahiptir.

Arabirim dizin oluşturucu bildiriminin erişimcileri, (§15.9) sınıf dizin oluşturucu bildiriminin erişimcilerine karşılık gelir, ancak accessor_body her zaman noktalı virgül olmalıdır. Bu nedenle, erişimciler yalnızca dizin oluşturucunun oku-yaz, salt okunur veya salt yazılabilir olduğunu belirtir.

Arabirim dizin oluşturucusunun tüm parametre türleri giriş açısından güvenli olmalıdır (§18.2.3.2). Ayrıca, tüm çıkış veya başvuru parametre türleri de çıkış açısından güvenli olmalıdır.

Not: Yaygın uygulama kısıtlamaları nedeniyle çıkış parametrelerinin giriş açısından güvenli olması gerekir. son not

Bir arabirim dizinleyicisinin türü, bir get erişimcisi varsa çıkış açısından güvenli olmalı ve bir set erişimcisi varsa giriş açısından güvenli olmalıdır.

18.4.6 Arabirim üyesi erişimi

Arabirim üyelerine üye erişimi (§12.8.7) ve dizin oluşturucu erişimi (§12.8.12.3) form I.M ve I[A]ifadeleri aracılığıyla erişilir; burada I bir arabirim türüdür, M, bu arabirim türünün bir yöntemi, özelliği veya olayıdır ve A bir dizin oluşturucu bağımsız değişken listesidir.

Kesin olarak tek devralma olan arabirimler için (devralma zincirindeki her arabirim tam olarak sıfır veya bir doğrudan temel arabirime sahiptir), üye aramasının etkileri (§12.5), yöntem çağırma (§12.8.1 0.2) ve dizin oluşturucu erişimi (§12.8.12.3) kuralları, sınıflar ve yapılar ile tamamen aynıdır: Daha fazla türetilmiş üye, aynı ada veya imzaya sahip daha az türetilmiş üyeleri gizler. Ancak, birden çok devralma arabirimleri için, iki veya daha fazla ilişkisiz temel arabirim aynı ada veya imzaya sahip üyeleri bildirdiğinde belirsizlikler oluşabilir. Bu alt bölümde, bazıları belirsizliklere yol açan ve bazıları belirsizliğe yol açmayan çeşitli örnekler gösterilir. Her durumda, açık dönüştürmeler belirsizlikleri çözmek için kullanılabilir.

Örnek: Aşağıdaki kodda

interface IList
{
    int Count { get; set; }
}

interface ICounter
{
    int Count { get; set; }
}

interface IListCounter : IList, ICounter {}

class C
{
    void Test(IListCounter x)
    {
        x.Count = 1;             // Error
        ((IList)x).Count = 1;    // Ok, invokes IList.Count.set
        ((ICounter)x).Count = 1; // Ok, invokes ICounter.Count
    }
}

Üye araması (§12.5) Count içinde IListCounter belirsiz olduğundan, ilk deyim derleme zamanı hatasına neden olur. Örnekte gösterildiği gibi belirsizlik, uygun temel arabirim türüne geçirilerek x çözümlenir. Bu tür dönüştürmelerin çalışma zamanı maliyeti yoktur; yalnızca örneğin derleme zamanında daha az türetilmiş bir tür olarak görülmesidir.

son örnek

Örnek: Aşağıdaki kodda

interface IInteger
{
    void Add(int i);
}

interface IDouble
{
    void Add(double d);
}

interface INumber : IInteger, IDouble {}

class C
{
    void Test(INumber n)
    {
        n.Add(1);             // Invokes IInteger.Add
        n.Add(1.0);           // Only IDouble.Add is applicable
        ((IInteger)n).Add(1); // Only IInteger.Add is a candidate
        ((IDouble)n).Add(1);  // Only IDouble.Add is a candidate
    }
}

n.Add(1) çağrısı, aşırı yük çözümleme kurallarını IInteger.Add uygulayarak seçer. Benzer şekilde, çağrısı n.Add(1.0)'yi seçer IDouble.Add. Açık atamalar eklendiğinde yalnızca bir aday yöntemi vardır ve bu nedenle belirsizlik yoktur.

son örnek

Örnek: Aşağıdaki kodda

interface IBase
{
    void F(int i);
}

interface ILeft : IBase
{
    new void F(int i);
}

interface IRight : IBase
{
    void G();
}

interface IDerived : ILeft, IRight {}

class A
{
    void Test(IDerived d)
    {
        d.F(1);           // Invokes ILeft.F
        ((IBase)d).F(1);  // Invokes IBase.F
        ((ILeft)d).F(1);  // Invokes ILeft.F
        ((IRight)d).F(1); // Invokes IBase.F
    }
}

IBase.F üyesi, ILeft.F üyesi tarafından gizleniyor. Bu nedenle d.F(1) çağrısı, ILeft.F üzerinden geçen erişim yolunda IBase.F gizli görünmese de IRight öğesini seçer.

Birden çok devralma arabirimlerinde gizlemeye yönelik sezgisel kural şudur: Bir üye herhangi bir erişim yolunda gizlenirse, tüm erişim yollarında gizlenir. tr-TR: IDerived ile ILeft üzerinden IBase erişim yolu IBase.F öğesini gizlediği için, IDerived ile IRight üzerinden IBase erişim yolunda üye de gizlidir.

son örnek

18.5 Nitelenmiş arabirim üye adları

Arabirim üyesine bazen nitelikli arabirim üyesi adıyla başvurulur. Arabirim üyesinin tam adı, üyenin bildirildiği arabirimin adından, ardından bir nokta ve ardından üyenin adından oluşur. Üyenin tam adı, üyenin bildirildiği arabirime başvurur.

Örnek: Bildirimlere göre

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

Paint öğesinin tam adı IControl.Paint'dir ve SetText'in tam adı ITextBox.SetText'dir. Yukarıdaki örnekte Paint'ye ITextBox.Paint olarak başvurmak mümkün değildir.

son örnek

Arabirim bir ad alanının parçası olduğunda, nitelikli arabirim üyesi adı ad alanı adını içerebilir.

Örnek:

namespace System
{
    public interface ICloneable
    {
        object Clone();
    }
}

Ad alanı içinde System, hem ICloneable.Clone hem de System.ICloneable.Clone, Clone yöntemi için nitelikli arabirim üye adlarıdır.

son örnek

18.6 Arabirim uygulamaları

18.6.1 Genel

Arabirimler sınıflar ve yapılar tarafından uygulanabilir. Bir sınıfın veya yapının doğrudan bir arabirim uyguladığını belirtmek için, arabirim sınıfın veya yapının temel sınıf listesine eklenir.

Örnek:

interface ICloneable
{
    object Clone();
}

interface IComparable
{
    int CompareTo(object other);
}

class ListEntry : ICloneable, IComparable
{
    public object Clone() {...}    
    public int CompareTo(object other) {...}
}

son örnek

Doğrudan bir arabirim uygulayan bir sınıf veya yapı, arabirimin tüm temel arabirimlerini de örtük olarak uygular. Sınıf veya yapı, temel sınıf listesindeki tüm temel arabirimleri açıkça listelemese bile bu durum geçerlidir.

Örnek:

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

class TextBox : ITextBox
{
    public void Paint() {...}
    public void SetText(string text) {...}
}

Burada, TextBox sınıfı hem IControl hem de ITextBox uygular.

son örnek

Bir sınıf C doğrudan bir arabirim uyguladığında, öğesinden C türetilen tüm sınıflar da örtük olarak arabirimi uygular.

Sınıf bildiriminde belirtilen temel arabirimler arabirim türleri (§8.4, §18.2) oluşturulabilir.

Örnek: Aşağıdaki kod, bir sınıfın oluşturulmuş arabirim türlerini nasıl uygulayabileceğini gösterir:

class C<U, V> {}
interface I1<V> {}
class D : C<string, int>, I1<string> {}
class E<T> : C<int, T>, I1<T> {}

son örnek

Genel sınıf bildiriminin temel arabirimleri , §18.6.3'te açıklanan benzersizlik kuralını karşılayacaktır.

18.6.2 Açık arabirim üyesi uygulamaları

Bir sınıf veya yapı, arabirimleri uygulama amacıyla açık arabirim üyesi uygulamaları bildirebilir. Açık arabirim üyesi uygulaması, uygun arabirim üye adına başvuran bir yöntem, özellik, olay veya dizin oluşturucu bildirimidir.

Örnek:

interface IList<T>
{
    T[] GetElements();
}

interface IDictionary<K, V>
{
    V this[K key] { get; }
    void Add(K key, V value);
}

class List<T> : IList<T>, IDictionary<int, T>
{
    public T[] GetElements() {...}
    T IDictionary<int, T>.this[int index] {...}
    void IDictionary<int, T>.Add(int index, T value) {...}
}

Burada IDictionary<int,T>.this ve IDictionary<int,T>.Add açık arabirim üyesi uygulamalarıdır.

son örnek

Örnek: Bazı durumlarda, bir arabirim üyesinin adı uygulayan sınıf için uygun olmayabilir, bu durumda arabirim üyesi açık arabirim üyesi uygulaması kullanılarak uygulanabilir. Örneğin, dosya soyutlaması uygulayan bir sınıf, büyük olasılıkla dosya kaynağını serbest bırakma etkisine sahip bir Close üye işlevi uygular ve açık arabirim üyesi uygulamasını kullanarak arabirimin Dispose yöntemini uygularIDisposable:

interface IDisposable
{
    void Dispose();
}

class MyFile : IDisposable
{
    void IDisposable.Dispose() => Close();

    public void Close()
    {
        // Do what's necessary to close the file
        System.GC.SuppressFinalize(this);
    }
}

son örnek

Bir yöntem çağırma, özellik erişimi, olay erişimi veya dizin oluşturucu erişiminde uygun arabirim üye adı aracılığıyla açık arabirim üyesi uygulamasına erişmek mümkün değildir. Açık arabirim üyesi uygulamasına yalnızca bir arabirim örneği üzerinden erişilebilir ve bu durumda yalnızca üye adıyla başvurulur.

Açık bir arabirim üyesi uygulaması, §15.6 dışında extern veya async haricinde herhangi bir değiştirici içerdiğinde derleme zamanı hatası oluşur.

Açık arabirim yöntem uygulamasının type_parameter_constraints_clause'leri içermesi, derleme zamanında bir hatadır. Genel bir açık arabirim yöntemi uygulamasına yönelik kısıtlamalar arabirim yönteminden devralınır.

Not: Açık arabirim üyesi uygulamaları diğer üyelerden farklı erişilebilirlik özelliklerine sahiptir. Açık arabirim üyesi uygulamalarına hiçbir zaman bir yöntem çağrısında veya özellik erişiminde uygun arabirim üyesi adı üzerinden erişilemediğinden, bunlar bir anlamda özeldir. Ancak, arabirim üzerinden erişilebildiği için, bir anlamda bildirildikleri arabirim kadar geneldirler. Açık arabirim üyesi uygulamaları iki birincil amaca hizmet eder:

  • Açık arabirim üyesi uygulamalarına sınıf veya yapı örnekleri aracılığıyla erişilemediğinden, arabirim uygulamalarının bir sınıfın veya yapının ortak arabiriminden dışlanmasına izin verir. Bu, özellikle bir sınıf veya yapı, bu sınıfın veya yapının tüketicisini ilgilendirmeyen bir iç arabirim uyguladığında kullanışlıdır.
  • Açık arabirim üyesi uygulamaları, aynı imzaya sahip arabirim üyelerinin kesinleştirilmesine olanak sağlar. Açık arabirim üyesi uygulamaları olmadan, bir sınıfın veya yapının aynı imzaya ve dönüş türüne sahip arabirim üyelerinin farklı uygulamalarına sahip olması mümkün değildir; aynı imzaya sahip ancak farklı dönüş türlerine sahip tüm arabirim üyelerinde herhangi bir uygulama olması mümkün değildir.

son not

Açık arabirim üyesi uygulamasının geçerli olması için, sınıf veya yapı, temel sınıf listesinde, tam arabirim üyesi adı, türü, tür parametresi sayısı ve parametre türleri açık arabirim üyesi uygulamasınınkilerle tam olarak eşleşen bir üye içeren bir arabirimi adlandırmalıdır. Arabirim işlevi üyesinin bir parametre dizisi varsa, ilgili açık arabirim üyesi uygulamasının karşılık gelen parametresinin params değiştiricisine sahip olmasına izin verilir, ancak zorunlu değildir. Arabirim işlevi üyesinin parametre dizisi yoksa, ilişkili açık arabirim üyesi uygulaması parametre dizisine sahip olmaz.

Örnek: Bu nedenle, aşağıdaki sınıfta

class Shape : ICloneable
{
    object ICloneable.Clone() {...}
    int IComparable.CompareTo(object other) {...} // invalid
}

IComparable.CompareTo bildiriminin sonucu derleme zamanı hatasıdır çünkü IComparableShape temel sınıf listesinde yer almamakta ve ICloneable'nin temel arabirimi olmamaktadır. Benzer şekilde, bildirimlerde

class Shape : ICloneable
{
    object ICloneable.Clone() {...}
}

class Ellipse : Shape
{
    object ICloneable.Clone() {...} // invalid
}

ICloneable.Clone içindeki Ellipse bildirimi, ICloneable'ün temel sınıf listesinde Ellipse açıkça listelenmediği için derleme zamanı hatasıyla sonuçlanır.

son örnek

Açık arabirim üyesi uygulamasının nitelikli arabirim üyesi adı, üyenin bildirildiği arabirime başvuracaktır.

Örnek: Bu nedenle, bildirimlerde

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

class TextBox : ITextBox
{
    void IControl.Paint() {...}
    void ITextBox.SetText(string text) {...}
}

Paint'in açık arabirim üyesi uygulaması IControl.Paint olarak yazılmalı, ITextBox.Paint olarak yazılmamalıdır.

son örnek

18.6.3 Uygulanan arabirimlerin benzersizliği

Genel tür bildirimi tarafından uygulanan arabirimler, olası tüm yapı türleri için benzersiz kalacaktır. Bu kural olmadan, belirli yapılandırılmış türler için çağrılacak doğru yöntemi belirlemek mümkün olmazdı.

Örnek: Genel bir sınıf bildiriminin aşağıdaki gibi yazılması için izin verilmiş olduğunu varsayalım:

interface I<T>
{
    void F();
}

class X<U ,V> : I<U>, I<V> // Error: I<U> and I<V> conflict
{
    void I<U>.F() {...}
    void I<V>.F() {...}
}

Buna izin verilseydi, aşağıdaki durumda hangi kodun yürütüleceğini belirlemek mümkün olmazdı:

I<int> x = new X<int, int>();
x.F();

son örnek

Genel tür bildiriminin arabirim listesinin geçerli olup olmadığını belirlemek için aşağıdaki adımlar gerçekleştirilir:

  • Genel bir sınıf, yapı veya arabirim bildiriminde Ldoğrudan belirtilen arabirimlerin listesi olsunC.
  • L öğesine, L içinde zaten bulunan arabirimlerin temel arabirimlerini ekleyin.
  • L içindeki herhangi bir yineleneni kaldırın.
  • C'den oluşturulan herhangi bir olası tür, tür bağımsız değişkenleri L'e yerine koyulduğunda L içinde iki arayüzün aynı olmasına neden olursa, o zaman C bildirimi geçersizdir. Tüm olası yapı türleri belirlenirken kısıtlama bildirimleri dikkate alınmaz.

Not: Yukarıdaki sınıf bildirimindeX, arabirim listesi L ve l<U>'yi I<V> içerir. U ve V aynı tür olduğunda bu iki arabirimin aynı türler olmasına neden olacağından bildirim geçersizdir. son not

Farklı devralma düzeylerinde belirtilen arabirimlerin birleştirilmesi mümkündür:

interface I<T>
{
    void F();
}

class Base<U> : I<U>
{
    void I<U>.F() {...}
}

class Derived<U, V> : Base<U>, I<V> // Ok
{
    void I<V>.F() {...}
}

Bu kod, Derived<U,V> hem de I<U> ve I<V> uygulasa bile geçerlidir. Kod

I<int> x = new Derived<int, int>();
x.F();

yöntemini Derivediçinde çağırır çünkü Derived<int,int>' etkin bir şekilde yeniden uygular I<int> (§18.6.7).

18.6.4 Genel yöntemlerin uygulanması

Genel bir yöntem örtük olarak bir arabirim yöntemi uyguladığında, her yöntem türü parametresi için verilen kısıtlamalar her iki bildirimde de eşdeğer olacaktır (herhangi bir arabirim türü parametresi uygun tür bağımsız değişkenleriyle değiştirildikten sonra), burada yöntem türü parametreleri soldan sağa sıralı konumlarla tanımlanır.

Örnek: Aşağıdaki kodda:

interface I<X, Y, Z>
{
    void F<T>(T t) where T : X;
    void G<T>(T t) where T : Y;
    void H<T>(T t) where T : Z;
}

class C : I<object, C, string>
{
    public void F<T>(T t) {...}                  // Ok
    public void G<T>(T t) where T : C {...}      // Ok
    public void H<T>(T t) where T : string {...} // Error
}

yöntemi C.F<T> örtük olarak uygular I<object,C,string>.F<T>. Bu durumda, C.F<T> tüm tür parametrelerinde örtük bir kısıtlama olduğundan T: object kısıtlamayı object belirtmek için gerekli değildir (veya izin verilmez). Arabirim türü parametreleri karşılık gelen tür bağımsız değişkenleriyle değiştirildikten sonra, kısıtlamalar arabirimdekilerle eşleştiği için C.G<T> yöntemi I<object,C,string>.G<T>'i örtük olarak uygular. Korumalı türler (C.H<T>bu örnekte) kısıtlama olarak kullanılamadığından yöntem string kısıtlaması bir hatadır. Örtük arabirim yöntemi uygulamalarının kısıtlamalarının eşleşmesi gerektiğinden kısıtlamanın atlanması da hata olabilir. Bu nedenle, örtük olarak uygulamak I<object,C,string>.H<T>mümkün değildir. Bu arabirim yöntemi yalnızca açık bir arabirim üyesi uygulaması kullanılarak uygulanabilir:

class C : I<object, C, string>
{
    ...
    public void H<U>(U u) where U : class {...}

    void I<object, C, string>.H<T>(T t)
    {
        string s = t; // Ok
        H<T>(t);
    }
}

Bu durumda, açık arabirim üyesi uygulaması kesinlikle daha zayıf kısıtlamalara sahip bir ortak yöntemi çağırır. T'den s'ye atama geçerli çünkü, bu kısıtlama kaynak kodda ifade edilemez olsa bile, TT: string kısıtlamasını devralır. son örnek

Not: Genel bir yöntem açıkça bir arabirim yöntemi uyguladığında, uygulayan yöntemde hiçbir kısıtlamaya izin verilmez (§15.7.1, §18.6.2). son not

18.6.5 Arabirim eşlemesi

Sınıf veya yapı, sınıfın veya yapının temel sınıf listesinde listelenen arabirimlerin tüm üyelerinin uygulamalarını sağlayacaktır. Bir uygulama sınıfı veya yapısında arabirim üyelerinin uygulamalarını bulma işlemi, arabirim eşlemesi olarak bilinir.

Bir sınıf veya yapı C için arabirim eşlemesi, temel sınıf listesinde Cbelirtilen her arabirimin her üyesi için bir uygulama bulur. Belirli bir arabirim üyesinin I.M uygulaması, üyenin bildirildiği arabirim I içinde belirlenir ve bu, her bir sınıf veya yapı M, öncelikle S ve C ardışık temel sınıflarını inceleyerek bir eşleşme bulunana kadar tekrarlanmaktadır:

  • S etiketi I ve M ile eşleşen açık bir arabirim üyesi uygulamasının bildirimini içeriyorsa, bu üye I.M'ün uygulamasıdır.
  • Aksi takdirde, S ile eşleşen statik olmayan bir public üyenin bildirimini M içeriyorsa, bu üye I.M uygulamasıdır. Birden fazla üye eşleşirse, hangi üyenin I.Muygulaması olduğu belirtilmez. Bu durum yalnızca, S oluşturulmuş bir tür ise ve genel türde bildirilen iki üyenin farklı imzalara sahip olduğu, ancak tür argümanlarının imzalarını özdeş hale getirmesi durumunda ortaya çıkabilir.

uygulamasının temel sınıf listesinde Cbelirtilen tüm arabirimlerin tüm üyeleri için uygulamalar bulunamazsa derleme zamanı hatası oluşur. Bir arabirimin üyeleri, temel arabirimlerden devralınan üyeleri içerir.

Yapılandırılmış arabirim türünün üyeleri, §15.3.3'te belirtilen karşılık gelen tür bağımsız değişkenleriyle değiştirilen herhangi bir tür parametresine sahip olarak kabul edilir.

Örnek: Örneğin, genel arabirim bildirimi göz önünde bulundurulduğunda:

interface I<T>
{
    T F(int x, T[,] y);
    T this[int y] { get; }
}

oluşturulan arabirimde I<string[]> şu üyeler bulunur:

string[] F(int x, string[,][] y);
string[] this[int y] { get; }

son örnek

Arabirim eşleme amacıyla, bir sınıf veya yapı üyesi A aşağıdaki durumlarda arabirim üyesiyle B eşleşir:

  • A ve B yöntemleridir ve ve'nin AB adı, türü ve parametre listeleri aynıdır.
  • A ve B özellikleridir, adı ve türü AB aynıdır ve A ile aynı erişimcilere B sahiptir (A açık bir arabirim üyesi uygulaması değilse ek erişimcilere izin verilir).
  • A ve B olayları, adı ve türü A ile B aynıdır.
  • Ave B dizin oluşturucularıdır, türü ve parametre listeleri AB aynıdır ve A (B açık bir arabirim üyesi uygulaması değilse ek erişimcilere sahip olması için izin verilir) ile aynı erişimcilere A sahiptir.

Arabirim eşleme algoritmasının önemli etkileri şunlardır:

  • Açık arabirim üyesi uygulamaları, bir arabirim üyesi uygulayan sınıf veya yapı üyesini belirlerken aynı sınıf veya yapıdaki diğer üyelere göre önceliklidir.
  • Genel olmayan veya statik üyeler arabirim eşlemeye katılmaz.

Örnek: Aşağıdaki kodda

interface ICloneable
{
    object Clone();
}

class C : ICloneable
{
    object ICloneable.Clone() {...}
    public object Clone() {...}
}

ICloneable.Clone üyesi, açık arabirim üyesi uygulamaları diğer üyelere göre öncelikli olduğundan, C içinde Clone'te ICloneable uygulaması olur.

son örnek

Bir sınıf veya yapı aynı ad, tür ve parametre türlerine sahip bir üye içeren iki veya daha fazla arabirim uygularsa, bu arabirim üyelerinin her birini tek bir sınıf veya yapı üyesine eşlemek mümkündür.

Örnek:

interface IControl
{
    void Paint();
}

interface IForm
{
    void Paint();
}

class Page : IControl, IForm
{
    public void Paint() {...}
}

Burada, hem Paint hem de IControl yöntemleri, IForm içindeki Paint yöntemine eşlenir. Elbette iki yöntem için ayrı açık arabirim üyesi uygulamalarına sahip olmak da mümkündür.

son örnek

Bir sınıf veya yapı gizli üyeleri içeren bir arabirim uygularsa, bazı üyelerin açık arabirim üyesi uygulamaları aracılığıyla uygulanması gerekebilir.

Örnek:

interface IBase
{
    int P { get; }
}

interface IDerived : IBase
{
    new int P();
}

Bu arabirimin uygulanması için en az bir açık arabirim üyesi uygulaması gerekir ve aşağıdaki formlardan birini alır

class C1 : IDerived
{
    int IBase.P { get; }
    int IDerived.P() {...}
}
class C2 : IDerived
{
    public int P { get; }
    int IDerived.P() {...}
}
class C3 : IDerived
{
    int IBase.P { get; }
    public int P() {...}
}

son örnek

Bir sınıf aynı temel arabirime sahip birden çok arabirim uyguladığında, temel arabirimin yalnızca bir uygulaması olabilir.

Örnek: Aşağıdaki kodda

interface IControl
{
    void Paint();
}

interface ITextBox : IControl
{
    void SetText(string text);
}

interface IListBox : IControl
{
    void SetItems(string[] items);
}

class ComboBox : IControl, ITextBox, IListBox
{
    void IControl.Paint() {...}
    void ITextBox.SetText(string text) {...}
    void IListBox.SetItems(string[] items) {...}
}

temel sınıf listesinde adlandırılan IControl, IControl tarafından devralınan ITextBox, ve IControl tarafından devralınan IListBox için ayrı uygulamalara sahip olmak mümkün değildir. Aslında, bu arabirimler için ayrı bir kimlik diye bir şey yoktur. Bunun yerine, ITextBox ve IListBox uygulamaları IControl'nin aynı uygulamasını paylaşır ve ComboBox ise IControl, ITextBox ve IListBox olmak üzere üç arabirimi uyguladığı kabul edilir.

son örnek

Bir temel sınıfın üyeleri arabirim eşlemesine katılır.

Örnek: Aşağıdaki kodda

interface Interface1
{
    void F();
}

class Class1
{
    public void F() {}
    public void G() {}
}

class Class2 : Class1, Interface1
{
    public new void G() {}
}

F içindeki Class1 yöntemi, Class2's uygulamasının Interface1 içinde kullanılır.

son örnek

18.6.6 Arabirim uygulaması devralma

Bir sınıf, temel sınıfları tarafından sağlanan tüm arabirim uygulamalarını devralır.

Bir arabirimi açıkça yeniden uygulamadan türetilmiş bir sınıf, temel sınıflarından devraldığı arabirim eşlemelerini hiçbir şekilde değiştiremez.

Örnek: Bildirimlerde

interface IControl
{
    void Paint();
}

class Control : IControl
{
    public void Paint() {...}
}

class TextBox : Control
{
    public new void Paint() {...}
}

Paint yöntemi, TextBox içindeki Paint yöntemini gizler Control, ancak Control.Paint'ün IControl.Paint'e olan eşlemesini değiştirmez ve sınıf örnekleri ile arabirim örnekleri aracılığıyla yapılan Paint çağrıları aşağıdaki etkilere sahip olacaktır.

Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();  // invokes Control.Paint();
t.Paint();  // invokes TextBox.Paint();
ic.Paint(); // invokes Control.Paint();
it.Paint(); // invokes Control.Paint();

son örnek

Ancak, bir arabirim yöntemi bir sınıftaki bir sanal yönteme eşlendiğinde, türetilmiş sınıfların sanal yöntemi geçersiz kılıp arabirimin uygulamasını değiştirmesi mümkündür.

Örnek: Yukarıdaki bildirimleri yeniden yazma

interface IControl
{
    void Paint();
}

class Control : IControl
{
    public virtual void Paint() {...}
}

class TextBox : Control
{
    public override void Paint() {...}
}

şimdi aşağıdaki etkiler gözlemlenecektir

Control c = new Control();
TextBox t = new TextBox();
IControl ic = c;
IControl it = t;
c.Paint();  // invokes Control.Paint();
t.Paint();  // invokes TextBox.Paint();
ic.Paint(); // invokes Control.Paint();
it.Paint(); // invokes TextBox.Paint();

son örnek

Açık arabirim üyesi uygulamaları sanal olarak bildirilemediğinden, açık arabirim üyesi uygulamasını geçersiz kılmak mümkün değildir. Ancak, açık bir arabirim üyesinin başka bir yöntemi çağırması tamamen geçerlidir ve bu diğer yöntem, türetilmiş sınıfların onu geçersiz kılabilmesi için sanal olarak bildirilebilir.

Örnek:

interface IControl
{
    void Paint();
}

class Control : IControl
{
    void IControl.Paint() { PaintControl(); }
    protected virtual void PaintControl() {...}
}

class TextBox : Control
{
    protected override void PaintControl() {...}
}

Burada, Control sınıfından türetilen sınıflar, IControl.Paint yöntemini geçersiz kılarak PaintControl uygulamasını özelleştirebilir.

son örnek

18.6.7 Arayüzü yeniden uygulama

Arabirim uygulamasını devralan bir sınıfın, temel sınıf listesine ekleyerek arabirimi yeniden uygulamasına izin verilir.

Bir arabirimin yeniden uygulanması, bir arabirimin ilk uygulamasıyla tam olarak aynı arabirim eşleme kurallarını izler. Bu nedenle, devralınan arabirim eşlemesinin arabirimin yeniden uygulanması için oluşturulan arabirim eşlemesi üzerinde hiçbir etkisi yoktur.

Örnek: Bildirimlerde

interface IControl
{
    void Paint();
}

class Control : IControl
{
    void IControl.Paint() {...}
}

class MyControl : Control, IControl
{
    public void Paint() {}
}

Control IControl.Paint'in Control.IControl.Paint üzerindeki eşlemesi, MyControl içindeki IControl.PaintMyControl.Paint üzerindeki yeniden uygulamayı etkilemez.

son örnek

Devralınan genel üye bildirimleri ve devralınan açık arabirim üyesi bildirimleri, yeniden uygulanan arabirimler için arabirim eşleme işlemine katılır.

Örnek:

interface IMethods
{
    void F();
    void G();
    void H();
    void I();
}

class Base : IMethods
{
    void IMethods.F() {}
    void IMethods.G() {}
    public void H() {}
    public void I() {}
}

class Derived : Base, IMethods
{
    public void F() {}
    void IMethods.H() {}
}

Burada, IMethods'ün Derived'deki uygulaması, arabirim yöntemlerini Derived.F, Base.IMethods.G, Derived.IMethods.H ve Base.I ile eşleştirir.

son örnek

Bir sınıf bir arabirim uyguladığında, örtük olarak bu arabirimin tüm temel arabirimlerini de uygular. Benzer şekilde, bir arabirimin yeniden uygulanması da örtük olarak arabirimin tüm temel arabirimlerinin yeniden uygulanmasıdır.

Örnek:

interface IBase
{
    void F();
}

interface IDerived : IBase
{
    void G();
}

class C : IDerived
{
    void IBase.F() {...}
    void IDerived.G() {...}
}

class D : C, IDerived
{
    public void F() {...}
    public void G() {...}
}

Burada, IDerived öğesinin yeniden uygulanması, IBase öğesini de yeniden uygular ve IBase.F'yi D.F üzerine eşler.

son örnek

18.6.8 Soyut sınıflar ve arabirimler

Soyut olmayan bir sınıf gibi, soyut sınıf da sınıfın temel sınıf listesinde listelenen arabirimlerin tüm üyelerinin uygulamalarını sağlayacaktır. Ancak, soyut bir sınıfın arabirim yöntemlerini soyut yöntemlerle eşlemesine izin verilir.

Örnek:

interface IMethods
{
    void F();
    void G();
}

abstract class C : IMethods
{
    public abstract void F();
    public abstract void G();
    }

Burada, IMethods ve F, G'den türeyen soyut olmayan sınıflarda geçersiz kılınması gereken soyut yöntemlerle eşleştirilir.

son örnek

Açık arabirim üyesi uygulamaları soyut olamaz, ancak açık arabirim üyesi uygulamalarının soyut yöntemleri çağırmasına elbette izin verilir.

Örnek:

interface IMethods
{
    void F();
    void G();
}

abstract class C: IMethods
{
    void IMethods.F() { FF(); }
    void IMethods.G() { GG(); }
    protected abstract void FF();
    protected abstract void GG();
}

Burada, C sınıfından türeyen soyut olmayan sınıfların FF ve GG'yi geçersiz kılmaları, dolayısıyla IMethods'ün gerçek uygulamasını sağlamaları gerekecektir.

son örnek