2010-11-01 13 views
16

he un objeto que implementa dos interfaces ... Las interfaces son:Especificación de múltiples interfaces para un parámetro

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

tal que

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; } 
} 

ahora tengo una función que necesita uno de sus parámetros para implementar estas dos interfaces. ¿Cómo voy a especificar eso en C#?

Un ejemplo sería

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

O es el problema de que mi diseño es un error y que debería estar llevando a cabo tanto en los interfaces en una interfaz de alguna manera

+1

"Ahora tengo una función que necesita uno de sus parámetros para implementar ambas interfaces." Las funciones o parámetros no implementan interfaces, las clases implementan interfaces. ¿Qué quieres decir? – McKay

+0

ver las ediciones. Sé que solo las clases pueden implementar interfaces – TerrorAustralis

+0

posible duplicado de [¿Es posible hacer que un parámetro implemente dos interfaces?] (Http://stackoverflow.com/questions/772053/is-it-possible-to-make-a- parameter-implement-two-interfaces) –

Respuesta

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

Esta es una buena respuesta. Me di cuenta de que había dejado alguna información crucial. La función a la que me refiero es el constructor de otra clase (El escenario es un nodo que construye otro nodo) ¿Pueden usarse genéricos en un constructor? – TerrorAustralis

+1

Como esta respuesta es válida para mi pregunta, la aceptaré, pero la cosa del constructor me está causando un dolor de cabeza :) – TerrorAustralis

+0

En ese caso, creo que tendrías que hacer la clase genérica. No parece que puedas tener un constructor genérico en una clase no genérica. –

13

En C#, las interfaces pueden ellos heredan de uno o más otras interfaces. Entonces, una solución sería definir una interfaz, digamos IObjectTreeNode<T> que deriva tanto de IObject como de ITreeNode<T>.

+3

-1: Esto cambiaría el requisito. Este método no requiere el parámetro para implementar IObject y ITreeNode , requeriría el parámetro para implementar IObjectTreeNode . Entonces los objetos que implementan ambas interfaces pero no las combinadas no están permitidos, mientras que deberían. –

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

Has definido un parámetro que implementa 'IObject' y otro que implementa' ITreeNode ', pero creo que el asker necesita un único parámetro que implemente ambos. –

2

Es probablemente más fácil de definir una interfaz que implementa tanto IObject y ITreeNode.

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

Otra opción, en caso de que no espera que la interfaz anterior se utiliza a menudo, es hacer que el método/función en cuestión genérica.

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

-1; esto simplemente repite las respuestas anteriores y no reconoce [el inconveniente señalado por Stijn en los comentarios] (http://stackoverflow.com/questions/4073440/specifying-multiple-interfaces-for-a-parameter#comment69322597_4073481) sobre el primer enfoque. –

Cuestiones relacionadas