Bird
Raised Fist0
C Sharp (C#)programming~7 mins

Interface vs abstract class decision in C Sharp (C#)

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Interfaces and abstract classes help organize code by defining rules for other classes. Choosing between them helps keep your program clear and easy to change.

When you want to define a contract that many different classes can follow, even if they are unrelated.
When you want to share some common code and state among related classes but still force them to implement some methods.
When you need to support multiple inheritance of behavior in C# (since a class can implement many interfaces but inherit only one class).
When you want to ensure certain methods are implemented but also provide default behavior.
When you want to separate what a class can do (interface) from how it does it (abstract class).
Syntax
C Sharp (C#)
public interface IExample
{
    void DoWork();
}

public abstract class AbstractExample
{
    public abstract void DoWork();

    public void CommonMethod()
    {
        Console.WriteLine("This is shared behavior.");
    }
}

An interface only declares method signatures without any implementation.

An abstract class can have both abstract methods (without body) and concrete methods (with body).

Examples
Interfaces can be empty or have many methods. They only declare what methods must be implemented.
C Sharp (C#)
public interface IWorker
{
    void Work();
}

// Empty interface example
public interface IEmpty {}

// Interface with multiple methods
public interface IAdvancedWorker
{
    void Work();
    void Rest();
}
Abstract classes can have methods with code and methods without code. They can also have fields and constructors.
C Sharp (C#)
public abstract class WorkerBase
{
    public abstract void Work();

    public void Rest()
    {
        Console.WriteLine("Resting...");
    }
}

// Abstract class with only abstract methods
public abstract class PureAbstract
{
    public abstract void DoSomething();
}
Interfaces can have default method implementations starting from C# 8, but this is less common and should be used carefully.
C Sharp (C#)
// Edge case: Interface with default implementation (C# 8+)
public interface IDefaultWorker
{
    void Work();
    void Rest() => Console.WriteLine("Default rest");
}
Sample Program

This program shows a dog class that inherits an abstract class and implements an interface, and a cat class that only implements the interface. Dog can use shared code from the abstract class, but cat cannot.

C Sharp (C#)
using System;

public interface IAnimal
{
    void Speak();
}

public abstract class AnimalBase
{
    public abstract void Speak();

    public void Eat()
    {
        Console.WriteLine("Eating food.");
    }
}

public class Dog : AnimalBase, IAnimal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

public class Cat : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Meow!");
    }
}

class Program
{
    static void Main()
    {
        Dog dog = new Dog();
        Cat cat = new Cat();

        Console.WriteLine("Dog says:");
        dog.Speak();
        dog.Eat();

        Console.WriteLine("Cat says:");
        cat.Speak();
        // cat.Eat(); // Not available because Cat does not inherit AnimalBase
    }
}
OutputSuccess
Important Notes

Time complexity: Choosing interface or abstract class does not affect runtime performance directly.

Space complexity: Both add no extra memory overhead beyond normal class inheritance.

Common mistake: Trying to add fields or method implementations in interfaces before C# 8, which is not allowed.

Use interfaces when you want to define capabilities without implementation. Use abstract classes when you want to share code and force some methods to be implemented.

Summary

Interfaces define what methods a class must have but do not provide code.

Abstract classes can provide some shared code and force subclasses to implement others.

Choose interfaces for unrelated classes that share behavior, and abstract classes for related classes sharing code.

Practice

(1/5)
1. Which statement best describes when to use an interface instead of an abstract class in C#?
easy
A. Use an interface when you want to provide shared code to subclasses.
B. Use an interface when unrelated classes share behavior but do not share code.
C. Use an abstract class when unrelated classes share behavior but do not share code.
D. Use an abstract class only when no methods need to be implemented.

Solution

  1. Step 1: Understand interfaces

    Interfaces define method signatures without implementation, so they are ideal for unrelated classes that share behavior but not code.
  2. Step 2: Understand abstract classes

    Abstract classes can provide shared code and force subclasses to implement certain methods, so they are better for related classes sharing code.
  3. Final Answer:

    Use an interface when unrelated classes share behavior but do not share code. -> Option B
  4. Quick Check:

    Interface = unrelated classes sharing behavior [OK]
Hint: Interfaces = behavior only, abstract classes = shared code [OK]
Common Mistakes:
  • Thinking abstract classes can't have implemented methods
  • Using abstract class for unrelated classes
  • Confusing interfaces as code providers
2. Which of the following is the correct syntax to declare an abstract class in C#?
easy
A. abstract class Vehicle { public abstract void Move(); }
B. interface Vehicle { void Move(); }
C. class abstract Vehicle { public void Move(); }
D. abstract Vehicle class { void Move(); }

Solution

  1. Step 1: Recall abstract class syntax

    In C#, the keyword abstract precedes class, followed by the class name and method declarations.
  2. Step 2: Check each option

    abstract class Vehicle { public abstract void Move(); } correctly uses "abstract class Vehicle" and declares an abstract method. Options A, C, and D have incorrect keyword order or use interface syntax.
  3. Final Answer:

    abstract class Vehicle { public abstract void Move(); } -> Option A
  4. Quick Check:

    abstract class syntax = "abstract class" [OK]
Hint: abstract class keyword order: 'abstract class' [OK]
Common Mistakes:
  • Swapping 'class abstract' instead of 'abstract class'
  • Using interface syntax for abstract class
  • Missing 'abstract' keyword before method
3. Consider the following code snippet:
interface IAnimal { void Speak(); }
abstract class Mammal { public void Breathe() { Console.WriteLine("Breathing"); } public abstract void Speak(); }
class Dog : Mammal, IAnimal { public override void Speak() { Console.WriteLine("Woof"); } }

var dog = new Dog();
dog.Breathe();
dog.Speak();

What will be the output when this code runs?
medium
A. Breathing Woof
B. Woof Breathing
C. Breathing
D. Compilation error due to multiple inheritance

Solution

  1. Step 1: Understand class and interface usage

    The class Dog inherits from abstract class Mammal and implements interface IAnimal. It overrides Speak() and inherits Breathe().
  2. Step 2: Trace method calls

    Calling dog.Breathe() prints "Breathing". Calling dog.Speak() prints "Woof" as overridden in Dog.
  3. Final Answer:

    Breathing Woof -> Option A
  4. Quick Check:

    Abstract class method + override = correct output [OK]
Hint: Abstract class methods run normally; override abstract methods [OK]
Common Mistakes:
  • Thinking multiple inheritance causes error in C#
  • Confusing order of output lines
  • Missing override keyword causing compile error
4. The following code causes a compilation error. What is the main reason?
abstract class Shape {
  public abstract void Draw();
}

class Circle : Shape {
  public void Draw() {
    Console.WriteLine("Drawing Circle");
  }
}
medium
A. Draw() method must be static in Circle.
B. Abstract classes cannot have abstract methods.
C. Circle cannot inherit from Shape because Shape is abstract.
D. Circle must declare Draw() as override, not just public.

Solution

  1. Step 1: Identify abstract method implementation rules

    When a class inherits an abstract method, it must override it using the override keyword.
  2. Step 2: Check Circle class method

    The Draw() method in Circle is declared as public void Draw() but missing override, causing a compile error.
  3. Final Answer:

    Circle must declare Draw() as override, not just public. -> Option D
  4. Quick Check:

    Override abstract method = must use 'override' keyword [OK]
Hint: Override abstract methods with 'override' keyword [OK]
Common Mistakes:
  • Omitting 'override' keyword on abstract method implementation
  • Thinking abstract classes can't have abstract methods
  • Assuming static needed for overridden methods
5. You need to design a system where multiple unrelated classes must implement a method Log() but also share some common logging code. Which approach is best in C#?
hard
A. Use only an interface ILogger with Log() method and no shared code.
B. Use only an abstract class with Log() as abstract method and shared code implemented.
C. Create an interface ILogger with Log() and a separate abstract class with shared code, then have classes implement both.
D. Use a concrete class with Log() and inherit it in all classes.

Solution

  1. Step 1: Analyze requirements

    Multiple unrelated classes must implement Log() and share some common code.
  2. Step 2: Choose interface and abstract class combination

    Interfaces allow unrelated classes to share method signatures. Abstract classes can provide shared code. Classes can implement interface and inherit abstract class to get both.
  3. Step 3: Evaluate other options

    Using only abstract class limits inheritance to related classes. Using only interface lacks shared code. Concrete class inheritance limits flexibility.
  4. Final Answer:

    Create an interface ILogger with Log() and a separate abstract class with shared code, then have classes implement both. -> Option C
  5. Quick Check:

    Interface + abstract class = behavior + shared code [OK]
Hint: Combine interface for behavior and abstract class for shared code [OK]
Common Mistakes:
  • Trying to use only abstract class for unrelated classes
  • Ignoring shared code needs
  • Assuming multiple inheritance of classes is allowed