2017-08-14 154 views
-1

最後,我想在調用超類方法後調用子類方法。我有一個代碼是這樣的:調用超類方法後調用子類方法

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

我願做這樣的事情:

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

我想避免鑄造父類到子類是這樣的:

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