Değişken Genel Arabirimleri Oluşturma (Visual Basic)
Arabirimlerdeki genel tür parametrelerini birlikte değişken veya değişken karşıtı olarak bildirebilirsiniz. Kovaryans, arabirim yöntemlerinin genel tür parametreleri tarafından tanımlanandan daha fazla türetilmiş dönüş türüne sahip olmasını sağlar. Contravariance, arabirim yöntemlerinin genel parametreler tarafından belirtilenden daha az türetilmiş bağımsız değişken türlerine sahip olmasını sağlar. Kovaryant veya değişken karşıtı genel tür parametrelerine sahip genel arabirime değişken adı verilir.
Not
.NET Framework 4, çeşitli mevcut genel arabirimler için varyans desteği sunar. .NET Framework'teki değişken arabirimlerin listesi için bkz . Genel Arabirimlerde Varyans (Visual Basic).
Değişken Genel Arabirimleri Bildirme
Genel tür parametreleri için ve out
anahtar sözcüklerini kullanarak in
değişken genel arabirimler bildirebilirsiniz.
Önemli
ByRef
Visual Basic'teki parametreler değişken olamaz. Değer türleri de varyansı desteklemez.
Anahtar sözcüğünü kullanarak out
ortak değişken genel tür parametresi bildirebilirsiniz. Kovarant türü aşağıdaki koşulları karşılamalıdır:
Türü yalnızca arabirim yöntemlerinin dönüş türü olarak kullanılır ve yöntem bağımsız değişkenlerinin türü olarak kullanılmaz. Bu, türün
R
birlikte değişken olarak bildirildiği aşağıdaki örnekte gösterilmiştir.Interface ICovariant(Of Out R) Function GetSomething() As R ' The following statement generates a compiler error. ' Sub SetSomething(ByVal sampleArg As R) End Interface
Bu kuralın bir özel durumu vardır. Yöntem parametresi olarak değişken olmayan bir genel temsilciniz varsa, türünü temsilci için genel tür parametresi olarak kullanabilirsiniz. Bu, aşağıdaki örnekteki tür
R
tarafından gösterilmiştir. Daha fazla bilgi için bkz. Temsilcilerde Varyans (Visual Basic) ve Func ve Eylem Genel Temsilcileri için Varyansı Kullanma (Visual Basic).Interface ICovariant(Of Out R) Sub DoSomething(ByVal callback As Action(Of R)) End Interface
Tür, arabirim yöntemleri için genel bir kısıtlama olarak kullanılmaz. Bu, aşağıdaki kodda gösterilmiştir.
Interface ICovariant(Of Out R) ' The following statement generates a compiler error ' because you can use only contravariant or invariant types ' in generic constraints. ' Sub DoSomething(Of T As R)() End Interface
Anahtar sözcüğünü kullanarak in
bir genel tür parametresi contravariant bildirebilirsiniz. Değişken karşıtı tür, arabirim yöntemlerinin dönüş türü olarak değil, yalnızca yöntem bağımsız değişkenlerinin türü olarak kullanılabilir. Değişken karşıtı tür, genel kısıtlamalar için de kullanılabilir. Aşağıdaki kod, değişken karşıtı bir arabirimin nasıl bildirilip yöntemlerinden biri için genel bir kısıtlamanın nasıl kullanılacağını gösterir.
Interface IContravariant(Of In A)
Sub SetSomething(ByVal sampleArg As A)
Sub DoSomething(Of T As A)()
' The following statement generates a compiler error.
' Function GetSomething() As A
End Interface
Aynı arabirimde, ancak aşağıdaki kod örneğinde gösterildiği gibi farklı tür parametreleri için hem kovaryansı hem de kontrvaryansı desteklemek de mümkündür.
Interface IVariant(Of Out R, In A)
Function GetSomething() As R
Sub SetSomething(ByVal sampleArg As A)
Function GetSetSomething(ByVal sampleArg As A) As R
End Interface
Visual Basic'te, temsilci türünü belirtmeden değişken arabirimlerde olayları bildiremezsiniz. Ayrıca, bir değişken arabirimi iç içe sınıflara, numaralandırmalara veya yapılara sahip olamaz, ancak iç içe arabirimlere sahip olabilir. Bu, aşağıdaki kodda gösterilmiştir.
Interface ICovariant(Of Out R)
' The following statement generates a compiler error.
' Event SampleEvent()
' The following statement specifies the delegate type and
' does not generate an error.
Event AnotherEvent As EventHandler
' The following statements generate compiler errors,
' because a variant interface cannot have
' nested enums, classes, or structures.
'Enum SampleEnum : test : End Enum
'Class SampleClass : End Class
'Structure SampleStructure : Dim value As Integer : End Structure
' Variant interfaces can have nested interfaces.
Interface INested : End Interface
End Interface
Değişken Genel Arabirimleri Uygulama
Sabit arabirimler için kullanılan söz dizimini kullanarak sınıflarda değişken genel arabirimler uygularsınız. Aşağıdaki kod örneğinde, genel bir sınıfta birlikte değişken arabiriminin nasıl uygulandığı gösterilmektedir.
Interface ICovariant(Of Out R)
Function GetSomething() As R
End Interface
Class SampleImplementation(Of R)
Implements ICovariant(Of R)
Public Function GetSomething() As R _
Implements ICovariant(Of R).GetSomething
' Some code.
End Function
End Class
Değişken arabirimleri uygulayan sınıflar sabittir. Örneğin, aşağıdaki kodu göz önünde bulundurun.
The interface is covariant.
Dim ibutton As ICovariant(Of Button) =
New SampleImplementation(Of Button)
Dim iobj As ICovariant(Of Object) = ibutton
' The class is invariant.
Dim button As SampleImplementation(Of Button) =
New SampleImplementation(Of Button)
' The following statement generates a compiler error
' because classes are invariant.
' Dim obj As SampleImplementation(Of Object) = button
Değişken Genel Arabirimlerini Genişletme
Bir değişken genel arabirimini genişlettiğiniz zaman, türetilmiş arabirimin in
varyansı destekleyip desteklemediğini açıkça belirtmek için ve out
anahtar sözcüklerini kullanmanız gerekir. Derleyici, genişletilmekte olan arabirimden varyansı çıkarmıyor. Örneğin, aşağıdaki arabirimleri göz önünde bulundurun.
Interface ICovariant(Of Out T)
End Interface
Interface IInvariant(Of T)
Inherits ICovariant(Of T)
End Interface
Interface IExtCovariant(Of Out T)
Inherits ICovariant(Of T)
End Interface
Arabirimde Invariant(Of T)
, genel tür parametresi T
sabittir, ancak IExtCovariant (Of Out T)
tür parametresinde her iki arabirim de aynı arabirimi genişletse de birlikte değişkendir. Aynı kural, değişken karşıtı genel tür parametrelerine de uygulanır.
Hem genel tür parametresinin T
birlikte değişken olduğu arabirimi hem de genişletme arabiriminde genel tür parametresi T
sabitse değişken olmayan arabirimi genişleten bir arabirim oluşturabilirsiniz. Bu, aşağıdaki kod örneğinde gösterilmiştir.
Interface ICovariant(Of Out T)
End Interface
Interface IContravariant(Of In T)
End Interface
Interface IInvariant(Of T)
Inherits ICovariant(Of T), IContravariant(Of T)
End Interface
Ancak, bir genel tür parametresi T
tek bir arabirimde birlikte değişken olarak bildirilirse, genişletme arabiriminde değişken karşıtı olarak bildiremezsiniz veya tersi de geçerlidir. Bu, aşağıdaki kod örneğinde gösterilmiştir.
Interface ICovariant(Of Out T)
End Interface
' The following statements generate a compiler error.
' Interface ICoContraVariant(Of In T)
' Inherits ICovariant(Of T)
' End Interface
Belirsizlikten Kaçınma
Değişken genel arabirimleri uyguladığınızda, varyans bazen belirsizliğe yol açabilir. Bundan kaçınılmalıdır.
Örneğin, bir sınıfta farklı genel tür parametreleriyle aynı değişken genel arabirimini açıkça uygularsanız, belirsizlik oluşturabilir. Derleyici bu durumda bir hata üretmez, ancak çalışma zamanında hangi arabirim uygulamasının seçileceği belirtilmez. Bu, kodunuzda küçük hatalar oluşmasına neden olabilir. Aşağıdaki kod örneğini inceleyin.
Not
ile Option Strict Off
, Visual Basic belirsiz bir arabirim uygulaması olduğunda bir derleyici uyarısı oluşturur. ile Option Strict On
Visual Basic bir derleyici hatası oluşturur.
' Simple class hierarchy.
Class Animal
End Class
Class Cat
Inherits Animal
End Class
Class Dog
Inherits Animal
End Class
' This class introduces ambiguity
' because IEnumerable(Of Out T) is covariant.
Class Pets
Implements IEnumerable(Of Cat), IEnumerable(Of Dog)
Public Function GetEnumerator() As IEnumerator(Of Cat) _
Implements IEnumerable(Of Cat).GetEnumerator
Console.WriteLine("Cat")
' Some code.
End Function
Public Function GetEnumerator1() As IEnumerator(Of Dog) _
Implements IEnumerable(Of Dog).GetEnumerator
Console.WriteLine("Dog")
' Some code.
End Function
Public Function GetEnumerator2() As IEnumerator _
Implements IEnumerable.GetEnumerator
' Some code.
End Function
End Class
Sub Main()
Dim pets As IEnumerable(Of Animal) = New Pets()
pets.GetEnumerator()
End Sub
Bu örnekte yöntemin ile Dog
arasında Cat
nasıl pets.GetEnumerator
seçim olduğu belirtilmemiştir. Bu, kodunuzda sorunlara neden olabilir.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin