Visual Basic'de Genel Türler (Visual Basic)

Genel tür, çeşitli veri türleri için aynı işlevselliği gerçekleştirmek üzere uyarlanan tek bir programlama öğesidir. Genel bir sınıf veya yordam tanımlarken, bu işlevselliği gerçekleştirmek isteyebileceğiniz her veri türü için ayrı bir sürüm tanımlamanız gerekmez.

Benzetme, çıkarılabilir kafalara sahip bir tornavida setidir. Döndürmeniz gereken vidayı inceler ve bu vida için doğru başı seçersiniz (yuvarlanmış, çapraz, yıldızlı). Tornavida tutamacına doğru başlığı yerleştirdikten sonra, aynı işlevi tornavidayla, yani vidayı çevirerek gerçekleştirirsiniz.

Diagram of a screwdriver set with different heads.

Genel bir tür tanımladığınızda, bunu bir veya daha fazla veri türüyle parametreleştirirsiniz. Bu, kullanma kodunun veri türlerini gereksinimlerine göre uyarlamasını sağlar. Kodunuz, her biri farklı bir veri türü kümesi üzerinde hareket eden genel öğeden birkaç farklı programlama öğesi bildirebilir. Ancak bildirilen öğelerin tümü, hangi veri türlerini kullanırlarsa kullansınlar aynı mantığı gerçekleştirir.

Örneğin, gibi Stringbelirli bir veri türünde çalışan bir kuyruk sınıfı oluşturmak ve kullanmak isteyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi, öğesinden System.Collections.Generic.Queue<T>böyle bir sınıf bildirebilirsiniz.

Public stringQ As New System.Collections.Generic.Queue(Of String)

Artık yalnızca değerlerle String çalışmak için kullanabilirsinizstringQ. stringQ değerler için Object genelleştirilme yerine için String özel olduğundan, geç bağlamanız veya tür dönüştürmeniz yoktur. Bu, yürütme süresinden tasarruf sağlar ve çalışma zamanı hatalarını azaltır.

Genel bir tür kullanma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Genel Sınıf Kullanma.

Genel Sınıf Örneği

Aşağıdaki örnekte genel bir sınıfın iskelet tanımı gösterilmektedir.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

Yukarıdaki iskelette bir ttür parametresi, yani sınıfını bildirirken sağladığınız bir veri türü için yer tutucudur. Kodunuzun başka bir yerinde, için tçeşitli veri türleri sağlayarak çeşitli sürümlerini classHolder bildirebilirsiniz. Aşağıdaki örnekte bu tür iki bildirim gösterilmektedir.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

Yukarıdaki deyimler, belirli bir türün tür parametresinin yerini aldığı, yerleşik sınıfları bildirir. Bu değiştirme, oluşturulmuş sınıf içindeki koda yayılır. Aşağıdaki örnek, içinde yordamın processNewItem nasıl göründüğünü integerClassgösterir.

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

Daha eksiksiz bir örnek için bkz . Nasıl yapılır: Farklı Veri Türlerinde Aynı İşlevselliği Sağlayabilecek Bir Sınıf Tanımlama.

Uygun Programlama Öğeleri

Genel sınıfları, yapıları, arabirimleri, yordamları ve temsilcileri tanımlayabilir ve kullanabilirsiniz. .NET Framework'ün yaygın olarak kullanılan genel öğeleri temsil eden çeşitli genel sınıfları, yapıları ve arabirimleri tanımladığını unutmayın. Ad System.Collections.Generic alanı sözlükler, listeler, kuyruklar ve yığınlar sağlar. Kendi genel öğenizi tanımlamadan önce içinde zaten kullanılabilir System.Collections.Genericolup olmadığını görün.

Yordamlar tür değildir, ancak genel yordamları tanımlayabilir ve kullanabilirsiniz. Bkz. Visual Basic'te Genel Yordamlar.

Genel Türlerin Avantajları

Genel bir tür, her biri belirli bir veri türü üzerinde çalışan birkaç farklı programlama öğesini bildirmek için bir temel görevi görür. Genel bir türün alternatifleri şunlardır:

  1. Veri türü üzerinde Object çalışan tek bir tür.

  2. Türün türüne özgü bir sürüm kümesi, her sürüm ayrı ayrı kodlanmış ve , Integergibi Stringbelirli bir veri türünde veya gibi customerkullanıcı tanımlı bir türde çalışıyor.

Genel bir tür, bu alternatiflere göre aşağıdaki avantajlara sahiptir:

  • Kasa ty yazın. Genel türler derleme zamanı türü denetimini zorlar. Herhangi bir veri türünü kabul etmeye dayalı Object türler ve giriş veri türünün kabul edilebilir olup olmadığını denetlemek için kod yazmanız gerekir. Genel türlerle, derleyici çalışma zamanından önce tür uyuşmazlıklarını yakalayabilir.

  • Performans. Genel türlerin verileri kutulayıp kaldırması gerekmez çünkü her biri bir veri türü için özeldir. Bunu temel alan Object işlemler, bunları dönüştürmek Object için giriş veri türlerini kutulamalıdır ve çıktıyı hedefleyen verileri kutusundan çıkarmalıdır. Kutulama ve kutu açma performansı düşürür.

    Temel Object alan türler de geç bağlıdır, bu da üyelerine erişim için çalışma zamanında ek kod gerektirdiği anlamına gelir. Bu, performansı da düşürür.

  • Kod Birleştirme. Genel türdeki kodun yalnızca bir kez tanımlanması gerekir. Bir türün türe özgü sürümleri kümesinin her sürümde aynı kodu çoğaltması gerekir ve tek fark bu sürüme özgü veri türüdür. Genel türlerle, türe özgü sürümlerin tümü özgün genel türden oluşturulur.

  • Kodu Yeniden Kullanma. Belirli bir veri türüne bağımlı olmayan kod, genelse çeşitli veri türleriyle yeniden kullanılabilir. Bunu genellikle başlangıçta tahmin etmediğiniz bir veri türüyle bile yeniden kullanabilirsiniz.

  • IDE Desteği. Genel bir türden bildirilen bir yapılı tür kullandığınızda, tümleşik geliştirme ortamı (IDE) kodunuzu geliştirirken size daha fazla destek verebilir. Örneğin, IntelliSense bir oluşturucunun veya yöntemin bağımsız değişkeni için türe özgü seçenekleri gösterebilir.

  • Genel Algoritmalar. Türden bağımsız soyut algoritmalar genel türler için iyi adaylardır. Örneğin, arabirimini kullanarak IComparable öğeleri sıralayan genel bir yordam, uygulayan IComparableherhangi bir veri türüyle kullanılabilir.

Sınırlamalar

Genel tür tanımındaki kod mümkün olduğunca türden bağımsız olmalıdır, ancak genel türünüz için sağlanan herhangi bir veri türünün belirli bir özelliğini gerekli kılabilir. Örneğin, sıralama veya harmanlama amacıyla iki öğeyi karşılaştırmak istiyorsanız, veri türlerinin IComparable arabirimi uygulaması gerekir. Tür parametresine bir kısıtlama ekleyerek bu gereksinimi zorunlu kılabilirsiniz.

Kısıtlama Örneği

Aşağıdaki örnek, uygulamak IComparableiçin tür bağımsız değişkeni gerektiren bir kısıtlamaya sahip bir sınıfın iskelet tanımını gösterir.

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

Sonraki kod, uygulamayan IComparablebir tür sağlamadan itemManager bir sınıf oluşturmayı denerse, derleyici bir hata sinyali gönderir.

Kısıtlama Türleri

Kısıtlamanız herhangi bir birleşimde aşağıdaki gereksinimleri belirtebilir:

  • Tür bağımsız değişkeninin bir veya daha fazla arabirim uygulaması gerekir

  • Tür bağımsız değişkeni en fazla bir sınıfın türünde veya öğesinden devralınmalıdır

  • Tür bağımsız değişkeni, nesne oluşturan kod tarafından erişilebilen parametresiz bir oluşturucuyu kullanıma sunmalıdır

  • Tür bağımsız değişkeni bir başvuru türü veya bir değer türü olmalıdır

Birden fazla gereksinim uygulamanız gerekiyorsa, küme ayraçlarının{ } () içinde virgülle ayrılmış bir kısıtlama listesi kullanırsınız. Erişilebilir bir oluşturucu gerektirmek için, listeye New Operator anahtar sözcüğünü eklersiniz. Başvuru türü gerektirmek için anahtar sözcüğünü Class eklersiniz; bir değer türü gerektirmek için anahtar sözcüğünü Structure eklersiniz.

Kısıtlamalar hakkında daha fazla bilgi için bkz . Tür Listesi.

Birden Çok Kısıtlama Örneği

Aşağıdaki örnek, tür parametresinde kısıtlama listesi olan genel bir sınıfın iskelet tanımını gösterir. Bu sınıfın bir örneğini oluşturan kodda tür bağımsız değişkeninin hem ve IDisposable arabirimlerini uygulaması, bir başvuru türü olması hem de IComparable erişilebilir parametresiz oluşturucuyu kullanıma sunması gerekir.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

Önemli Terimler

Genel türler aşağıdaki terimleri tanıtır ve kullanır:

  • Genel Tür. Bildirdiğinizde en az bir veri türü sağladığınız bir sınıf, yapı, arabirim, yordam veya temsilci tanımı.

  • Parametre yazın. Genel tür tanımında, türü bildirdiğinizde sağladığınız bir veri türü için yer tutucu.

  • Bağımsız Değişken Yazın. Genel bir türden bir tür oluşturulduğunda tür parametresinin yerini alan belirli bir veri türü.

  • Kısıtlama. Tür parametresinde, bunun için sağlayabildiğiniz tür bağımsız değişkenini kısıtlayan bir koşul. Kısıtlama, tür bağımsız değişkeninin belirli bir arabirimi uygulaması, belirli bir sınıftan olması veya devralması, erişilebilir bir parametresiz oluşturucuya sahip olması veya bir başvuru türü ya da değer türü olmasını gerektirebilir. Bu kısıtlamaları birleştirebilirsiniz, ancak en fazla bir sınıf belirtebilirsiniz.

  • Yapı türü. Tür parametreleri için tür bağımsız değişkenleri sağlayarak genel bir türden bildirilen bir sınıf, yapı, arabirim, yordam veya temsilci.

Ayrıca bkz.