views:

165

answers:

4

I want to implement a function in the base class but I also want it to be overridden in the derived classes everytime. So it is more like "abstract function but with a body".

What am I looking for? Am I looking for the right thing?

+13  A: 

If the base-class has something to say, but you want it overridden "every time", then I would have a pair of methods:

public void DoSomething() {
    //things to do before
    DoSomethingCore();
    //things to do after
}
protected abstract void DoSomethingCore();
Marc Gravell
And you might have meant to throw in a mention of the Template Method pattern (or else you might have been shooting for brevity)
Ruben Bartelink
What about the "virtual" keyword before DoSomething method?
Kamarey
@Kamarey The DoSomething method isn't virtual: it's the DoSomethingCore method that the subclasses are expected to overwrite/implement.
ChrisW
+1  A: 

You're looking for a virtual method (use this modifier to allow overriding the method), but you cannot force the user to overwrite it. Forcing this would not make sense if you have a body anyways, since one could just call base.YourMethod() and do nothing else, which does the same as not overriding the method in the first place.

public virtual YourMethod() {
   // your base class code here
}

and then the overriding method in a different class:

public override YourMethod() {
   // code to do before the base call
   base.YourMethod();
   // code to do after the base call
}
Lucero
+3  A: 

If your base class does something in the method, but you want to make sure that every subclass is forced to implement some part of the method, then you want the Template Method pattern, as described in Marc Gravell's answer.

There's no way to provide a default implementation in your base class and still force subclasses to provide their own implementation. You could however create an abstract base class and inherit from it to provide the default implementation, but make that concrete class sealed.

public abstract class FooBase {
    public abstract void DoStuff();
}

public sealed class FooImpl : FooBase {
    public override void DoStuff {
        //default widget-munging code
    }
}

Now any classes which inherit from FooBase have to implement DoStuff(), but you have a default implementation FooImpl from which subclasses may not inherit.

You might also prefer to delegate the responsibility for implementing the method to a separate class, which is passed to the base class in its constructor. That's called the Strategy pattern.

public sealed class Foo {
    private IFooStrategy _strategy;
    public Foo(IStrategy strategy) {
        _strategy = strategy;
    }
    void DoStuff() {
        _strategy.DoStuff();
    }
    public static IFooStrategy DefaultStrategy {
        //return singleton instance of the default strategy
    }
}

Now instead of subclassing Foo, you instead create new implementations of the IFooStrategy interface, and pass those to your Foo instance. So you could either do:

new Foo(Foo.DefaultStrategy);

or

new Foo(new DifferentStrategy());
Matt Howells
+1  A: 

Sounds like your base implementation will never be called. Why would you want to provide an implementation that nobody can get to (jumping through hoops not withstanding)

Ralph Shillington