Soru Listeden Devralın


Ne tür bir miras alan yeni bir sınıfın uygulanmasının en hızlı yolu nedir? List<T>?

class Animal {}

class Animals : List<Animal> {} // (1)

Karşılaştığım bir problem: (1), Herhangi bir kurucunun miras almanın yararını elde edemediğimi buldum. List<T>.

Sonunda, isterim Animals gibi davranmak List<T> (ör., Linq ile uyumlu hale getirilebilir). Ama buna ek olarak, kendi özel yöntemlerimi de ekleyebilmeyi isterdim.


34
2018-03-21 10:14


Menşei


En hızlı ne demek istiyorsun? - alexn
Gönderiniz bana oldukça iyi görünüyor! - Stuart
Yukarıdaki kodunuz bunu yapardı. Herhangi bir kurucu uygulamanız ve temel çağrıda ilgili kurucuya (Liste <Hayvan>) başvurmanız yeterli olacaktır. Hayvanlar sınıfında herhangi bir özel yöntem oluşturabilirsiniz. - detaylor
olası kopyası C #: Listeyle Kalıtım Sorunu <T> - George Stocker♦


Cevaplar:


Eğer oluşturmak istiyorsanız kamuya açık almamalısınız hayvan koleksiyonu List<T> ve bunun yerine Collection<T> ve postfix'i kullan Collection sınıf adına. Örnek: AnimalCollection : Collection<Animal>.

Bu tarafından desteklenmektedir çerçeve tasarımı yönergeleridaha spesifik olarak:

YAPMA kullanım ArrayList, List<T>,    Hashtableveya Dictionary<K,V> içinde   kamu API'ları. kullanım Collection<T>,    ReadOnlyCollection<T>,    KeyedCollection<K,T>veya   Bunun yerine CollectionBase alt türleri. Not   jenerik koleksiyonların sadece   Framework 2.0 sürümünde desteklenir   ve yukarıda.


45
2018-03-21 10:27



Bu kılavuzu neden takip etmem gerektiğini anlamıyorum. - R. Martinho Fernandes
OP bu listenin içinde bir şey yapmak isterse, bu gerçekten anlamlı olur. OP temel yöntemleri geçersiz kılabilir. Gerçekten de başka bir değer görmüyorum. List<T> sadece liste türünü aramak için Animal sağ? - gideon
@Martinho Fernandes, bu bir ilke Diğerleri gibi, ancak genel API'nizde yazılan bir koleksiyon sağladığınızda, türünüz olduğu için gelecekteki sürümlerde değiştirebilirsiniz. Doğrudan <T> Listesini kullanırsanız, şansınız kalmaz. - João Angelo
Ayrıca arayüzleri kullanmayı düşünebilirsiniz: ICollection <T>, IEnumerable <T>, IDictionary <TKey, TValue> vb. - chillitom
@Martinho: Belki de, Add / Remove yöntemlerini Collection<T> yapabilirsin. Btw, uygulamak tercih ederim IList<T>veya ICollection<T> bir iç kullanma List<T> miras almak yerine Collection<T>... - digEmAll


Kurucular, sınıfla birlikte miras alınmaz. İstediğiniz kurucuları yeniden düzenlemelisiniz.

public class AnimalsCollection : List<Animal>
{
     public AnimalsCollection(IEnumerable<Animal> animals) : base(animals) {} 
}

21
2018-03-21 10:22



Downvoters nedenini söylemek ister? Neden "herhangi bir kurucuya sahip olmadığını" sordu, bu yüzden cevabım böyle olduğu yol. Eğer katılmıyorsanız, bazı geri bildirimlerden vazgeçmeye ne dersiniz? - Anderson Imes
Tokk için aynı sebep. Ancak bu, bir kez daha anonim düşüşlerin neden emildiğini gösterir: Sadece yardımcı olmuyor. - Konrad Rudolph
bakın: stackoverflow.com/questions/3748931/ stackoverflow.com/questions/898152/ stackoverflow.com/questions/794679/ stackoverflow.com/questions/5207459/ stackoverflow.com/questions/2136213/ stackoverflow.com/questions/349904 stackoverflow .com / sorular / 1257214 - George Stocker♦
@George Stocker: Bu hala OP'nin sorusu değildi. Ona daha iyi bir yönde bir dürtme vermek iyi bir şeydir, ama ben, kişinin gerçek sorusunu cevaplamadan önce her kişinin yaklaşımını analiz etmemiz gerektiğinden nefret ediyorum. Kurucuların miras almadığını bilmek, kendi başına yararlı bir şeydir. - Anderson Imes
@Anderson Evet, fakat genel düşünce burada OP'lere balık vermek değil, onlara balık avlamayı öğretmek değildir. Bahsedilen, Bu cevabı reddetmemiştim ve ben sadece tekrar anonim düşüşlerin emilebileceğini söyleyebilirim. - Konrad Rudolph


Türetmek List<T> tavsiye edilmez. Öncelikle, List asla uzantı değil, performans anlamına geliyordu.

Kendi özel koleksiyonunuzu oluşturmak istiyorsanız, Collection<T>. Senin durumunda şu olurdu:

class Animals : Collection<Animal> {}

11
2018-03-21 10:29



Ur tavsiye ve yaptım göre yaptım Collection<MyClass>. Ama bir yerde problem gibi Collection<T> gibi yöntemleri desteklemiyor Sort, Find, FindAll ve daha birçok çok yararlı yöntem. Bunu devralmak için değiştirmek zorundayım. List<MyClass>. Yapabileceğim bir şey var mı ..? - shashwat
@shashwat Bu yöntemlere sahip değil çünkü Collection herhangi bir öğe grubunu temsil etmek için genel bir sınıf olması gerekiyordu. Örneğin, bir matematik kümesinin belirli bir sırası yoktur ve sıralanamaz. Find öğeler benzersiz değilse belirsiz olabilir. Her iki durum da neyin bir parçası olmalıdır. Collection için kullanılabilir, bu yüzden içeremez Sort ve Find genellik kaybetmeden. Her ne kadar muhtemelen bir ListCollection : CollectionÇünkü, insanların bunu en çok kullandıkları şey bu. - Superbest


Listeden devralmanın ihtiyaç duyacağınız kadar tam özellikli olmadığını aklınızda bulundurun, birçok üye sanal değildir, bu yüzden temel uygulamayı gizlemenin tek yolu, new sözdizimi (aksine override).

Standart liste eylemleri üzerinde özel davranış göstermeye başlamanız gerekiyorsa, tüm liste arayüzlerini gerçek depolama için yalnızca bir iç liste kullanan bir türe uygulayacağım.

Bu son gereksinimlerinize büyük ölçüde bağlıdır.


5
2018-03-21 10:21



Ur tavsiye ve yaptım göre yaptım Collection<MyClass>. Ama bir yerde problem gibi Collection<T> gibi yöntemleri desteklemiyor Sort, Find, FindAll ve daha birçok çok yararlı yöntem. Bunu devralmak için değiştirmek zorundayım. List<MyClass>. Yapabileceğim bir şey var mı ..? - shashwat
@shashwat Sort, Find ve FindAll vb LINQ açısından uygulanabilir IEnumerable<T>Bu yüzden sorun değil. - Earth Engine


class Animals : List<Animal> {}

en iyi yol gibi görünüyor, çünkü bunu böyle tanımladıktan sonra kullanabilirsiniz.

Benim tavsiyem senin soruların başlığı: Inherit List<T> ;-)


4
2018-03-21 10:16



Downvoters nedenini söylemek ister? - Tokk
Bahşiş vermediniz ama genel bir kural olarak asla somut toplama sınıflarından miras alırlar (aslında meli yapıldı sealed). Bir arabirimi uygulamak ya da soyut bir temel sınıftan miras almak daha çok tercih edilir. Collection<T>). - Konrad Rudolph
Konrad ile anlaştı. Devralma List<T> Yapmaman gereken şeylerden biri. Stack Overflow'ta yüzlerce kez konuşuldu. - George Stocker♦
görmek: stackoverflow.com/questions/3748931/...  stackoverflow.com/questions/898152/...  stackoverflow.com/questions/794679/...  stackoverflow.com/questions/5207459/...  stackoverflow.com/questions/2136213/...  stackoverflow.com/questions/349904  stackoverflow.com/questions/1257214 - George Stocker♦


Bundan miras alınması gerekli değil List toplama başlatma sözdizimini kullanmak veya Linq uzantısı yöntemlerini kullanmak.

Sadece uygulamak IEnumerable ve ayrıca Add yöntem.


4
2018-03-21 10:16