2017-07-12 8 views
1

Lors de l'extension d'une classe avec une méthode courante, l'ordre que vous appelez les méthodes fluentes est important, en raison de l'héritage et du type de l'objet renvoyé. Une méthode courante de la base retournera un objet du type de base, qui n'aura aucune méthode courante du type hérité. Mais inversez les appels de méthode et vous allez bien.Comment puis-je rendre l'ordre non pertinent lors de l'appel de méthodes fluides d'objets hérités?

Par exemple:

public class Thing 
{ 
    public Thing DoThing() 
    { 
    return this; 
    } 
} 

public class ExtendedThing : Thing 
{ 
    public ExtendedThing DoExtendedThing() 
    { 
    return this; 
    } 
} 

// This works. 
// DoExtendedThing returns an ExtendedThing object, 
// which gets DoThing from Thing via inheritance 
var extendedThing1 = new ExtendedThing().DoExtendedThing().DoThing(); 

// This doesn't work. 
// DoThing returns a Thing object, which doesn't have 
// DoExtendedThing on it 
var extendedThing2 = new ExtendedThing().DoThing().DoExtendedThing() 

Comment pourrais-je obtenir DoThing de ne pas retourner un Thing, mais revenir sur l'objet de quel que soit le type de l'objet d'appel a été étendu en, même si elle aurait pas idée de ce type était au moment de la compilation.

Ou dois-je juste savoir appeler les méthodes fluides dans l'ordre "correct"?

+0

Êtes-vous seulement d'écrire des méthodes étendues à la chose et pas d'autres fonctionnalités? Si c'est le cas, vous pouvez simplement avoir des méthodes d'extension réelles qui retournent Thing au lieu d'avoir une classe dérivée de chose. –

Répondre

1

Je crois que cela peut être résolu avec la pattern suivante:

class Base<T> where T : Base<T> 
{ 
    public T Thing() 
    { 
     return (T)this; 
    } 
} 

class Derived : Base<Derived> 
{ 
    public void AnotherThing() 
    { 
     Console.WriteLine("Hello!"); 
    } 
} 

Pour la ligne var extended = new Derived().Thing();, extended a la possibilité d'appeler AnotherThing().

Est-ce que c'est ce que vous cherchez?

Mise à jour: il se trouve que, si déjà répondu here