Start here. This is the direct spoken answer to practice first.
Why this question matters
I use an interface when consumers need a capability contract that unrelated types can implement. I use an abstract base class when derived types share a genuine identity, protected state, lifecycle, and implementation that belongs in one inheritance hierarchy.
I use an interface for a capability contract and an abstract base class for a genuine hierarchy with shared state or implementation. A payment port or clock is usually an interface because the application needs behavior without shared object state. A framework template with a stable algorithm and carefully chosen extension points may justify an abstract base class. C# allows a type to implement several interfaces but inherit from only one class, so choosing a base class consumes an important design option.