2017-07-12 3 views
1

流暢なメソッドでクラスを拡張する場合、継承と返されるオブジェクトの型のために、流暢なメソッドを呼び出す順序が重要です。基底からの流暢なメソッドは、基底型のオブジェクトを返します。継承された型の流暢なメソッドはありません。しかし、メソッド呼び出しを逆にしても問題ありません。継承されたオブジェクトの流暢なメソッドを呼び出すときに、どうやって順序を無関係にすることができますか?

例えば

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

をどのように私はおそらくThingを返さないようにDoThingを得ることができるが、代わりにそれは無いだろうにもかかわらず、呼び出し元のオブジェクトはに拡張されているどんなタイプのオブジェクトに戻りますコンパイル時にそのタイプが何であったかというアイディア。

「正しい」順序で流暢なメソッドを呼び出すだけでいいですか?

+0

あなたが唯一のものではなく、他の機能への拡張メソッドを追加していると答えた場合は?その場合は、実際の拡張メソッドを持つだけで、Thingの派生クラスを持つ代わりにThingを返すことができます。 –

答えて

1

私は、これは、以下のpatternで解くことができると信じて:

ライン var extended = new Derived().Thing();については
class Base<T> where T : Base<T> 
{ 
    public T Thing() 
    { 
     return (T)this; 
    } 
} 

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

extendedAnotherThing()を呼び出すための能力を持っています。

あなたはそれを探していますか?

更新:それは結局のところ、すでにhere

関連する問題