Question: I am in the process of factoring my code. I have a Car class as a base class. Extending car class are SUV and Sedan. Potentially, I will have to add a lot more type of cars. They will all have the exact same Run method. I wonder if it is possible to remove Run method from all derived classes, and keep Run method in Car class which reference the ignition created in derived classes. Below is the simplified code. Also, ignition should be created only once.

```
public abstract class Car
{
    static Ignition ignition;
    static void Start(){ ignition = A;}
    public void Run(){
        using(ignition){
            Start{};
        }
    }
}

public class Sedan : Car
{
    static Ignition ignition;
    static void Start(){ ignition = B;}
    public void Run(){
        using(ignition){
            Start{};
        }
    }
}

public class SUV : Car
{
    static Ignition ignition;
    static void Start(){ ignition = C;}
    public void Run(){
        using(ignition){
            Start{};
        }
    }
}

```

Answer: 
> 
> I wonder if it is possible to remove Run method from all derived classes, and keep Run method in Car class which reference the ignition created in derived classes
> 
> 
> 

Yes, but only if you get rid of the `static` methods and properties. If you make them *instance* methods and properties then they will be inherited, and you can make `Start` virtual:

```
public abstract class Car
{
    protected Ignition ignition {get; set;}
    virtual void Start(){ ignition = A;}
    public void Run(){
            Start();
    }
}

public class Sedan : Car
{
    override void Start(){ ignition = B;}
}

public class SUV : Car
{
    override void Start(){ ignition = C;}
}

```
You don't need to implement `Run()` in each derived class, and in fact I would argue you do NOT want to for this example. Each of the derived may provide their own `Ignition`, great, but just have `Run()` by only on your base class.

Also, is there any reason `Ignition` is static, instead of given to the base `Car` class during construction? This would likely allow you to remove your `Start()` method.