Genel Sınıflar (C# Programlama Kılavuzu)

Genel sınıflar, belirli bir veri türüne özgü olmayan işlemleri kapsültir. Genel sınıflar için en yaygın kullanım, bağlantılı listeler, karma tablolar, yığınlar, kuyruklar, ağaçlar vb. gibi koleksiyonlardır. Koleksiyondan öğe ekleme ve kaldırma gibi işlemler, depolanan verilerin türüne bakılmaksızın temelde aynı şekilde gerçekleştirilir.

Koleksiyon sınıfları gerektiren çoğu senaryo için önerilen yaklaşım, .NET sınıf kitaplığı 'nda sağlananları kullanmaktır. Bu sınıfların kullanımı hakkında daha fazla bilgi için bkz. .net 'Teki genel Koleksiyonlar.

Genellikle, mevcut bir somut sınıfla başlayarak genel sınıflar oluşturur ve en iyi Genelleştirme ve kullanılabilirlik bakiyesine ulaşana kadar, türleri tek seferde tür parametrelerine değiştirerek. Kendi genel sınıflarınızı oluştururken, önemli noktalara şunlar dahildir:

  • Tür parametrelerine genelleştiriedilecek türler.

    Kural olarak, ne kadar çok tür parametreleştirebilirsiniz, kodunuzun daha esnek ve yeniden kullanılabilir hale gelmesi de olur. Ancak, çok fazla Genelleştirme, diğer geliştiricilerin okuması veya anlaşılması zor olan kodlar oluşturabilir.

  • Varsa tür parametrelerine uygulanacak kısıtlamalar (bkz. tür parametrelerine yönelik kısıtlamalar).

    İşlenmesi gereken türleri işleyebilmeniz için mümkün olan en yüksek kısıtlamaları uygulamak iyi bir kuraldır. Örneğin, genel sınıfınızın yalnızca başvuru türleriyle kullanılması amaçlandığını biliyorsanız, sınıf kısıtlamasını uygulayın. Bu, sınıfınızın değer türleriyle istenmeden kullanımını engeller ve üzerinde işlecini kullanmanıza olanak sağlar as T ve null değerler olup olmadığını kontrol eder.

  • Genel davranışın temel sınıflar ve alt sınıflara göre çarpanının yapılıp yapılmayacağını belirtir.

    Genel sınıflar temel sınıf olarak işlev sağladığından, genel olmayan sınıflarda olduğu gibi aynı tasarım konuları da geçerlidir. Bu konunun ilerleyen kısımlarında genel temel sınıflardan devralma kurallarını inceleyin.

  • Bir veya daha fazla genel arabirim uygulanıp etkinleştirilmeyeceğini belirtir.

    Örneğin, genel türler tabanlı bir koleksiyonda öğe oluşturmak için kullanılacak bir sınıf tasarlıyorsanız, sınıfınızın türü olduğu gibi bir arabirim uygulamanız gerekebilir IComparable<T> T .

Basit bir genel sınıf örneği için bkz. Genel türlere giriş.

Tür parametreleri ve kısıtlamaları için kurallar, özellikle devralma ve üye erişilebilirliği ile ilgili genel sınıf davranışı için çeşitli etkilere sahiptir. Devam etmeden önce bazı terimleri anlamanız gerekir. Bir genel sınıf Node<T>, istemci kodu için, bir tür bağımsız değişkeni belirterek, kapalı bir oluşturulmuş tür () oluşturmak üzere sınıfına başvurabilir Node<int> . Alternatif olarak, tür parametresi belirtilmemiş olabilir, örneğin, bir genel temel sınıf belirttiğinizde açık bir oluşturulan tür ( Node<T> ) oluşturabilirsiniz. Genel sınıflar somut, Kapalı oluşturulmuş veya açık oluşturulmuş temel sınıflardan kalýtýmla alabilir:

class BaseNode { }
class BaseNodeGeneric<T> { }

// concrete type
class NodeConcrete<T> : BaseNode { }

//closed constructed type
class NodeClosed<T> : BaseNodeGeneric<int> { }

//open constructed type
class NodeOpen<T> : BaseNodeGeneric<T> { }

Genel olmayan, diğer bir deyişle, somut, sınıflar, açık oluşturulmuş sınıflardan veya tür parametrelerinden devralınabilir, çünkü istemci kodunun temel sınıfı oluşturmak için gereken tür bağımsız değişkenini sağlaması için çalışma zamanında hiçbir yol yoktur.

//No error
class Node1 : BaseNodeGeneric<int> { }

//Generates an error
//class Node2 : BaseNodeGeneric<T> {}

//Generates an error
//class Node3 : T {}

Açık oluşturulmuş türlerden devralan genel sınıflar, aşağıdaki kodda gösterildiği gibi, devralan sınıf tarafından paylaşılmayan herhangi bir temel sınıf türü parametre için tür bağımsız değişkenleri sağlamalıdır:

class BaseNodeMultiple<T, U> { }

//No error
class Node4<T> : BaseNodeMultiple<T, int> { }

//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }

//Generates an error
//class Node6<T> : BaseNodeMultiple<T, U> {}

Açık oluşturulmuş türlerden devraldığı genel sınıflar, temel türdeki kısıtlamaların bir üst kümesi veya sayısı olan kısıtlamaları belirtmelidir:

class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

Genel türler, birden çok tür parametrelerini ve kısıtlamalarını şu şekilde kullanabilir:

class SuperKeyType<K, V, U>
    where U : System.IComparable<U>
    where V : new()
{ }

Açık oluşturulmuş ve kapalı oluşturulmuş türler, yöntem parametreleri olarak kullanılabilir:

void Swap<T>(List<T> list1, List<T> list2)
{
    //code to swap items
}

void Swap(List<int> list1, List<int> list2)
{
    //code to swap items
}

Bir genel sınıf bir arabirim uygularsa, bu sınıfın tüm örnekleri bu arabirime eklenebilir.

Genel sınıflar sabit. Diğer bir deyişle, bir giriş parametresi bir belirtiyorsa List<BaseClass> , sağlamaya çalışırsanız derleme zamanı hatası alırsınız List<DerivedClass> .

Ayrıca bkz.