2010-09-10 6 views
2

J'ai une classe qui a une méthode Add différente que les autres classes et donc ne peut pas implémenter la même interface ... Dois-je séparer l'interface actuelle pour qu'elle puisse l'utiliser aussi ou devrais-je simplement créer une autre interface?C# - Fraction d'interface?

MISE À JOUR:

public interface IProductRepository<T, T2> 
    where T : class 
    where T2 : class 
{ 
    void Add(T model, int categoryId); 
    void Edit(T model, int id); 
    void Delete(int id); 

    T2 Get(int id); 
} 

Comme vous le voyez alors l'interface ci-dessus ont une méthode Add qui nécessite une categoryId.

Ma classe de catégorie est la même que ci-dessus, mais sans le paramètre categoryId dans la méthode Add. Devrais-je simplement créer une nouvelle interface pour la classe Category?

+2

Que voulez-vous dire par "split an interface"? – dtb

+0

Du code aiderait. Que fait la méthode Add, quelle relation ont les classes? Allez-vous créer des instances des classes en utilisant l'interface, ou l'interface est-elle juste là pour un "contrat"? @Svisstack a raison - pensez à ce que c'est. – RPM1984

Répondre

1

Pensez à ce que c'est.

Peut-être que votre autre classe ne ressemble pas à la fonctionnalité de cette interface plutôt que de faire la même action (ajouter). Ensuite, vous pouvez créer une autre interface pour ce nouveau type de classe (nouveau) ou laisser cette classe seule sans interface abstraite.

Peut-être que vous voulez faire un refactoring sur l'autre classe pour obtenir la définition de Add() smillar dans l'interface.

Si vous ne pouvez pas refactoriser une autre classe et que cette classe semble avoir cette interface. Ensuite, vous créez une autre interface ou dans l'ancienne nouvelle fonction de l'interface comme Add_Extended() pour ajouter des fonctionnalités avec une autre liste arguemnt.

+2

Cette réponse me confond plus que la question. –

+1

Je comprends fondamentalement ce qu'ils disent. Essentiellement, * "Essayez de concevoir votre modèle d'objet afin que cela ne se présente pas." *. Ils sont polonais, donc l'anglais est probablement une deuxième langue. – ChaosPandion

+0

@ChaosPandion: merci de votre soutien ;-) – Svisstack

4

C# vous permet d'implémenter explicitement une méthode d'interface:

public class A : IFoo, IBar{ 
    void IFoo.DoSomething() { 
     //DoSomething(); 
    } 
    int IBar.DoSomething() { 
     return -1; 
    } 
} 

Cela devrait vous permettre d'implémenter une interface, même si elle est en conflit avec les signatures de méthode que vous avez déjà définis. La méthode appelée dépend du type sur lequel elle est appelée. Par exemple:

((IFoo) new A()).DoSomething(); // ... may do something different than ... 
((IBar) new A()).DoSomething(); // ... would do. 
+2

Vous devriez vraiment lancer si vous attendez qu'un objet soit d'un certain type. Une 'NullReferenceException' ne serait pas très utile pour essayer de déboguer. – ChaosPandion

+0

Je suis d'accord avec le chaos, il peut également être écrit "IFoo foo = new A(); foo.DoSomething();" –

+1

J'aimerais que les gens ne considèrent pas l'opérateur 'as' comme une alternative plus agréable à (cast). Ils ne sont pas les mêmes! –

Questions connexes