2017-08-14 132 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>(); 
    } 
}