C#

2010-10-06 6 views
10

Arabirimler devralma Uygulamamı yazarken karşılaştığım oldukça büyük (benim için) sorununu aşmaya çalışıyorum. Şuna bak, (ı basitlik için kod kısaltmak için çalışacağız) lütfen:C#

Ben IRepository<T> denilen kök arayüzüne sahip. Bunu uygulayan Sonra, IBookRepository : IRepository<Book> Sonra, beton sınıfı: BookRepository : IBookRepository

RepositoryManager sınıfta ben

IRepoItemprivate IRepository<IRepoItem> currentRepo; Kitap sınıfı tarafından uygulanan bir arayüz açıkladı. Şimdi

, ben böyle bir şey yapmak deneyin:

dolaylı türünü dönüştürülemez 'BookRepository' 'IRepository' için:

currentRepo = new BookRepository(); 

Visual Studio hata mesajı verir. bir şey denilen kovaryans olduğunu

Ben (neredeyse kesin) biliyorum ... Açık dönüştürme açıkça döküm çalıştı (bir döküm eksik?)

var, ancak çalışma zamanı istisnası atılır ve bu (muhtemelen) .Net 4.0'da çözüldü. Maalesef, 3.5 numaralı çerçeve kullanarak yazıyorum ve bunu değiştiremiyorum. Lütfen bana ne yapması gerektiğine dair tavsiyelerde bulunun - bu sorunu nasıl aşacağınız? RepoFactory'den currentRepo'yu almak istiyorum, bu da kullanıcıların ihtiyaçlarına göre birkaç çeşit deponit üretecek. Burada bağlantılara izin verilip verilmediğini bilmiyorum, ancak uygulama oluşturmayı tanımladığım http://olgatherer.wordpress.com/'da bir çeşit blog yazdım. İngilizcem iyi değil ama umarım beni anlamak yeterlidir. Cevap için şimdiden teşekkür ederim. kesinlikle bir IRepository<IRepoItem> gibi bir IRepository<Book> tedavi edemez .NET 3.5 olarak

Saygılarımızla, skrzeczowas

+0

currentRepo beyan türü nedir:

interface IRepository<T> { } interface IRep<T> : IRepository<IRepoItem> where T : IRepoItem { } interface IBookRepository : IRep<Book> { } class BookRepository : IBookRepository { } 

o zaman istediğinizi yapabilirsiniz: –

+0

Boşver, görüyorum ki bir . –

cevap

4

.

Biz gerçekten bunu çözmek için nasıl bilmek RepositoryManager en çok depo kullanmakta olduğunuz hakkında daha fazla bilgi edinmek gerekiyordu ... ama IRepository<T> uzanan olmayan bir jenerik IRepository arayüzünü oluşturabilir

? T'ye atıfta bulunmayan tüm üyelerin dahil olmasını sağlayın. Ardından, currentRepo ürününü yalnızca bir IRepository olarak bildirebilirsiniz.

A olur .NET 4'te IRepository ve IRepository arasında herhangi bir ilişki yoktur .NET 3.5 olarak

+0

+1 - Bu jenerik olmayan 'İpi' arayüzünü düşündüm, ancak nasıl getirileceğinden emin değildim. Mükemmel Jon! =) –

+0

Tekrar merhaba! Burada açıklanan şekilde depolarım var: http://olgatherer.wordpress.com/2010/08/18/repositoriesrus/ Ve veritabanını yönetmek ve her bir tablo (kitap, çizgi romanlar, posta kutuları, vb.) Için depolar oluşturmak için DbManager'ı yarattım.). Şimdi, DbManager'daki şu ankiRepository'in BookRepository, StampsRepository olabileceğini, ne olursa olsun - arayüzlerle bu şeyin iyi olacağını düşündüm, ama ne yazık ki değil, çünkü IRepoemi (bugün farkettiğim gibi) o zaman tüm farklı özelliklere sahip olmalıydı ... :( – skrzeczowas

0

, sen kovaryans ve contravariance desteği ile böyle bir şey elde edebiliriz (ama IRepository arayüz bildiriminde bağlıdır) jenerik olmayan bir Işıma arabirimi kullanarak ve kendinizinkini yapmakla saldırabilirsiniz. Biliyorum, bu harika değil, ama tanımladığınız fonk- siyonite kovaryans/kontravaryans desteği gerektiriyor.

 BookRepository br = new BookRepository(); 
     IRepository<IRepoItem> currentRepo = br; 
+0

Bu cevap için teşekkür ederim, bunu aşağıdan kullandım ve bunun bana tam olarak uymadığını fark ettim: (Şimdi ne yapacağımı bilmiyorum ... İRTİBAT, kitapların, çizgi romanların, pulları :( – skrzeczowas

1

ara katman (IRep) kullanmayı deneyin?
+0

Merhaba! Bu harika ve çok zarif, bunu yayınladığınız için çok sevindim. Ne yazık ki, yukarıdaki yazıya yaptığım gibi, bunun tamamen bana uygun olmadığını anladım. Kitaplar, Pullar, Çizgi Romanlarda uygulanacak bir arayüz, böylece farklı öğeler için tüm özelliklere sahip olacak. Bu akıllı değil ve istediğimi elde etmenin başka bir yolunu bulmak zorundayım - bu demek oluyor ki currentRepo'nun olmasını istiyorum BookRepository veya StampsRepository ya da başka bir depo ne olursa olsun ... Belki yardım edebilir misiniz, lütfen? – skrzeczowas

+0

Diğer öğeler için bir arabirim olan IRepoItem, yalnızca "tüm özellikler" yerine ortak olan şeyleri birleştirmesiyle sonuçlanmalıdır. Örneğin, IMOeable sadece Taşı yöntemini ortaya çıkarmalı, her türden (Cheetah, Car, Airplane gibi) türetilen her şey değil. – Grozz

+0

Ama sonra, diyelim ki, currentRepo = StampsRepo() olacaksa, sadece İpi Deposu'nun içerdiği yöntemleri kullanabileceğim. IStampsRepository yöntemlerini kullanamayacağım :(Ben bu currentRepo'nun ne tür olduğunu sorabileceğime inanıyorum: eğer (currentRepo, IBookRepository) eğer (currentRepo, IStampsRepository ise) başka bir şey yaparsa ... Ama bu değil iyi bir nesne programlama, sanırım, yaptığım tüm varsayımları yeniden gözden geçirmeliyim, çünkü belki de istediğim aptalca ve başarılabilir değil ... – skrzeczowas