2010-11-01 12 views
16

ben ... arabirimleri iki arabirimi uygulayan bir nesnedir olan adres:bir parametre için birden arayüzleri belirtme

public class ObjectNode : IObject, ITreeNode<IObject> 
{ 
    public string Class { get; private set; } 
    public string Name { get; private set; } 
    public IEnumerable<IObjectProperty> Properties { get; set; } 
    public IEnumerable<IObject> Children { get; private set; } 
    public IObject Parent { get; private set; } 
} 

Şimdi ben birini gerektiren bir işleve sahip

public interface IObject 
{ 
    string Name { get; } 
    string Class { get; } 
    IEnumerable<IObjectProperty> Properties { get; } 
} 
public interface ITreeNode<T> 
{ 
    T Parent { get; } 
    IEnumerable<T> Children { get; } 
} 

Öyle ki onun Bu arabirimlerin her ikisini de uygulayacak parametreler. Bunu C# 'de belirtmek için nasıl giderim?

bir örnek

public TypedObject(ITreeNode<IObject> baseObject, IEnumerable<IType> types, ITreeNode<IObject>, IObject parent) 
{ 
    //Construct here 
} 

olmak Ya da benim tasarım yanlış sorundur ve ben uygulanması hem C# 'nasılsa

+1

"Artık bu arabirimlerin her ikisini de uygulamak için parametrelerinden birine gereksinim duyan bir işleve sahibim." Fonksiyonlar veya parametreler arayüzleri uygulamıyor, sınıflar arayüzleri uyguluyor. Ne demek istiyorsun? – McKay

+0

düzenlemeleri görün. Ben sadece sınıflar – TerrorAustralis

+0

olası bir çiftini uygulayabildiğini biliyorum [Parametre iki arabirim uygulamak mümkün mü?] (Http://stackoverflow.com/questions/772053/is-it-possible-to-make-a- parametre-uygulama-iki arabirim) –

cevap

24
public void Foo<T>(T myParam) 
    where T : IObject, ITreeNode<IObject> 
{ 
    // whatever 
} 
+0

Bu iyi bir cevap. Bazı önemli bilgileri çıkardığımı fark ettim. Ben başka bir sınıf için kurucu olduğunu atıfta bulunan işlevdir (Senaryo başka bir düğüm inşa eden bir Düğümdür) Jenerikler bir kurucuda kullanılabilir mi – TerrorAustralis

+1

Bu cevap benim soru için geçerli olduğundan kabul edeceğim, ama yapıcı şey bana neden oluyor bir baş ağrısı :) – TerrorAustralis

+0

Bu durumda, sınıf jenerik yapmak zorunda olduğunu düşünüyorum. Genel olmayan bir sınıf üzerinde genel bir kurucunuz olabilir gibi görünmüyor. –

13

bir arayüz üzerinde olanlar arayüzler gerektiğini olur, arabirimler kendileri bir ya dan devralabilir daha başka arayüzler. Yani bir çözüm bir arabirim tanımlamak olacaktır IObject ve ITreeNode<T> hem kaynaklanmaktadır IObjectTreeNode<T> söylerler.

+3

-1: Bu gereksinimi değiştirir. Bu yöntem IObject ve ITreeNode uygulamaya parametre gerektirmez, bu IObjectTreeNode uygulamaya parametre gerektirecektir. Yani, hem arayüzleri hem de kombine olmayan nesneleri kabul etmelerine izin verilmez. –

-3
public void MethodName<TParam1, TParam2>(TParam1 param1, TParam2 param2) 
    where TParam1 : IObject 
    where TParam2 : ITreeNode<IObject> 
+4

'IObject''ü uygulayan bir parametre tanımladıysanız ve ITILNode ''ü uygulayan bir parametre tanımladınız, ancak bence bu denetçinin her ikisini de uygulayan tek bir parametreye ihtiyacı olduğunu düşünüyorum. –

2

O IObject ve ITreeNode hem uygulayan bir arabirim tanımlamak için muhtemelen en kolay yoldur. Yukarıdaki arayüz sıklıkla kullanılacak sanmıyoruz durumunda

public interface IObjectNode<T> : IObject, ITreeNode<T> 
{ 
} 

Diğer bir seçenek, jenerik söz konusu yöntemi/işlevi yapmaktır.

public void Foo<T>(T objectNode) where T : IObject, ITreeNode<IObject> 
+0

-1; Bu, sadece önceki cevapları tekrarlar ve [yorumlarda Stijn tarafından işaret edilen dezavantajı] onaylamaz (http://stackoverflow.com/questions/4073440/specifying-multiple-interfaces-for-a-parameter#comment69322597_4073481) ilk yaklaşım. –