2015-08-27 10 views
5

Ho questa interfaccia:implementazione di interfaccia con diversi nomi dei metodi

public interface INameScope 
{ 
    void Register(string name, object scopedElement); 
    object Find(string name); 
    void Unregister(string name); 
} 

Ma io voglio che la mia realizzazione hanno nomi diversi per i metodi. La mia implementazione ha già un metodo Register che ha un altro significato.

Non esiste un metodo per rendere i metodi implementati con nomi come "RegisterName", "FindName" o "UnregisterName" invece di dover utilizzare gli stessi nomi?

+0

Perché non modificare l'interfaccia? –

+0

Perché ... https://msdn.microsoft.com/en-us/library/system.windows.markup.inamescope(v=vs.110).aspx – SuperJMN

+0

Ah mio male. Non è chiaro che non è possibile regolare l'interfaccia dalla domanda. –

risposta

8

Non proprio, ma è possibile utilizzare explicit interface implementation:

public class SomeScope : INameScope 
{ 
    void INameScope.Register(string name, object scopedElement) 
    { 
     RegisterName(name, scopedElement); 
    } 

    public void Register(...) 
    { 
     // Does something different 
    } 

    public void RegisterName(...) 
    { 
     // ... 
    } 

    ... 
} 

sarei molto attenti a fare questo se il metodo esistente Register ha parametri simili anche se - mentre il compilatore sarà felice con questo, si dovrebbe chiedersi come chiaro che sta per essere quello di chiunque legga il codice:

SomeScope x = new SomeScope(...); 
INameScope y = x; 
x.Register(...); // Does one thing 
y.Register(...); // Does something entirely different 
+0

Sì, so cosa intendi. Forse dovrebbe esserci una classe di hosting con un namescope (associazione) ed esponendo i suoi metodi come public RegisterName (...) {namescope.Register (...)}. È più una questione di design, quindi? – SuperJMN

+1

@SuperJMN: Sì, sarebbe molto sensato, tranne il fatto che non è possibile utilizzare la classe esistente per qualcosa che si aspetta un 'INameScope'. –

+0

Bel punto, Jon. Ma questo sembra ancora un grave inconveniente per me. I nomi dell'interfaccia impongono agli implementatori di mantenere i nomi, significativi o meno ... – SuperJMN

5

rilegatura di implementazioni dei metodi per interfacciare i metodi che implementano è fatto da meth firma, cioè il nome e la lista dei parametri. La classe che implementa un'interfaccia con un metodo Register deve avere un metodo Register con la stessa firma. Sebbene C# ti permetta di utilizzare un diverso metodo come implementazione esplicita, in situazioni come questa sarebbe meglio optare per lo Bridge Pattern, che ti consente di "connettere" un'interfaccia a un'implementazione con firme di metodo non corrispondenti:

interface IMyInterface { 
    void Register(string name); 
} 

class MyImplementation { 
    public void RegisterName(string name) { 
     // Wrong Register 
    } 
    public void RegisterName(string name) { 
     // Right Register 
    } 
} 

la classe ponte "disaccoppia" MyImplementation da IMyInterface, che ti permette di cambiare i nomi dei metodi e proprietà in modo indipendente:

class MyBridge : IMyInterface { 
    private readonly MyImplementation impl; 
    public MyBridge(MyImplementation impl) { 
     this.impl = impl; 
    } 
    public void Register(string name) { 
     impl.RegisterName(); 
    } 
} 

Quando apportare modifiche a uno dei lati del ponte, è necessario apportare la modifica corrispondente nel ponte di essere b fare affari.

+0

OK, ma come puoi vedere, con il bridge, non stai cambiando il nome del metodo richiamato. Nell'interfaccia si chiama "Register", lo stesso nome che ha nel bridge. Quello che voglio è implementarlo con un nome diverso. – SuperJMN

+1

@SuperJMN Il bridge consente a 'MyImplementation' di fingere di implementare' IMyInterface' senza implementarlo.Il bridge implementa l'interfaccia con i nomi corrispondenti per mantenere C# felice, ma la logica "payload" dell'implementazione proviene dalla classe 'MyImplementation'. La classe bridge semplicemente inoltra le chiamate, mentre 'MyImplementation' fa tutto il lavoro e mantiene tutto lo stato. – dasblinkenlight

Problemi correlati