2017-08-14 11 views
-1

最終的に、スーパークラスメソッドを呼び出した後にサブクラスメソッドを呼び出したいと思います。私はこのようなサブクラスにスーパークラスをキャスト避けたいスーパークラスメソッドの呼び出し後にサブクラスメソッドを呼び出す

new SubClass() 
    .CommonMethod1() 
    .CommonMethod2()  // Returns SuperClass 
    .OptionalLastMethod1(); // I would like to do something like this. 

に:私はこのような何かをしたいと思います

public class SuperClass 
{ 
    protected WrapperClass<T> GetWrapperClass<T>() 
    { 
     return new WrapperClass(someStuff).Wrap<T>(); 
    } 

    public SuperClass CommonMethod1() 
    { 
     // Do something 
     return this; 
    } 

    public SuperClass CommonMethod2() 
    { 
     // Do something else 
     return this; 
    } 

    // Many CommonMethods 
} 

public class SubClass : SuperClass 
{ 
    public WrapperClass<SomeClass> OptionalLastMethod1() 
    { 
     return base.GetWrapperClass<SomeClass>(); 
    } 

    public WrapperClass<SomeOtherClass> OptionalLastMethod2() 
    { 
     return base.GetWrapperClass<SomeOtherClass>(); 
    } 
} 

:私はこのようなコードに何かを持っている

var subClass = ((SubClass)new SubClass().CommonMethod1().CommonMethod2()).LastMethodToCall(); 

ここでの重要な点は、使いやすさであり、実装の容易さではありません。すべての入力をいただければ幸いです。

+4

このような流暢なコードの場合、(一般的な)拡張メソッドは、階層を超越する問題がなく、クラス作成者が陰気できる必要がなくなるため、お友達です。彼らがLINQと一緒に導入されたのは事実ではありません。 –

+0

'OptionalLastMethod1'メソッドは' SuperClass'の一部ではないので、 'SubClass'インスタンスから直接呼び出すことができません。あなたはこのメソッドを 'SuperClass'にも持っていますし、' SuperClass'のために作成された拡張メソッドとしてこのメ​​ソッドを持たせることはできません。 –

+0

@john私の本当の疑問は、(抽象化を使用せずに)スーパークラスからサブクラスメソッドを呼び出す方法です。あなたのリンクは、チェーンの作成方法について話します。 – Steven

答えて

0

これで解決しました。 - 無関係なコードを削除しました。

public class SuperClass<S> where S : SuperClass<S> 
{ 
    public S CommonMethod1() 
    { 
     // Do something 
     return (S) this; 
    } 

    public S CommonMethod2() 
    { 
     // Do something else 
     return (S) this; 
    } 

    // Many CommonMethods 
} 

public class SubClass : SuperClass<SubClass> 
{ 
    public WrapperClass<SomeClass> OptionalLastMethod1() 
    { 
     return base.GetWrapperClass<SomeClass>(); 
    } 

    public WrapperClass<SomeOtherClass> OptionalLastMethod2() 
    { 
     return base.GetWrapperClass<SomeOtherClass>(); 
    } 
} 
関連する問題