Search code examples
c#genericsinheritancesubclasssuperclass

Calling subclass method after calling superclass method


Ultimately, I would like to call a subclass method AFTER calling superclass method. I have a code 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>();
    }
}

I would like to do something like this:

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

I would like to avoid casting SuperClass into SubClass like this:

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

The Important point here is ease of use, not ease of implementation. Any input is appreciated.


Solution

  • Solved it by doing this. - removed some irrelevant code.

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