2017-07-12 3 views
1

Wenn Sie eine Klasse mit einer fließenden Methode erweitern, ist die Reihenfolge, in der Sie die fließenden Methoden aufrufen, aufgrund der Vererbung und des Typs des zurückgegebenen Objekts von Bedeutung. Eine fließende Methode von der Basis gibt ein Objekt vom Basistyp zurück, das keine fließenden Methoden vom geerbten Typ hat. Aber kehren Sie die Methodenaufrufe um und es geht Ihnen gut.Wie kann ich eine Bestellung irrelevant machen, wenn ich fließende Methoden von geerbten Objekten anrufe?

Zum Beispiel:

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() 

Wie könnte ich möglicherweise DoThing zu keinen Thing zurück, aber zurückkehren, anstatt auf das Objekt von unabhängig von der Art der anrufende Objekt in verlängert wurde, obwohl es hätte keine Idee, was dieser Typ zur Kompilierzeit war.

Oder muss ich nur wissen, die fließenden Methoden in der "richtigen" Reihenfolge zu nennen?

+0

beantwortet wurde nur Sie erweiterte Methoden zur Sache hinzufügen und nicht andere Funktionalität? Wenn dies der Fall ist, können Sie nur tatsächliche Erweiterungsmethoden verwenden, die Thing zurückgeben, anstatt eine abgeleitete Klasse von Thing zu haben. –

Antwort

1

Ich glaube, das pattern mit den folgenden gelöst werden kann:

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

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

Für die Linie var extended = new Derived().Thing();, extended die Fähigkeit AnotherThing() zu nennen hat.

Ist es das wonach Sie suchen?

Update: es stellt sich heraus, wenn bereits here

Verwandte Themen