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
When to use abstract vs concrete in C#
📖 Scenario: Imagine you are building a simple program to manage different types of vehicles in a garage. Some vehicles share common features, but each type has its own way of moving.
🎯 Goal: You will create an abstract class for vehicles and concrete classes for specific vehicle types. This will help you understand when to use abstract classes versus concrete classes in C#.
📋 What You'll Learn
Create an abstract class called Vehicle with an abstract method Move().
Create two concrete classes called Car and Bicycle that inherit from Vehicle.
Implement the Move() method differently in Car and Bicycle.
Create instances of Car and Bicycle and call their Move() methods.
💡 Why This Matters
🌍 Real World
Abstract classes help organize code when many objects share common features but behave differently. For example, different vehicles share moving but move in their own way.
💼 Career
Understanding abstract vs concrete classes is important for designing clean, reusable code in software development jobs.
Progress0 / 4 steps
1
Create an abstract class Vehicle
Write an abstract class called Vehicle with an abstract method Move() that returns void.
C Sharp (C#)
Hint
Use the abstract keyword before the class and the method. The method should have no body.
2
Create concrete classes Car and Bicycle
Create two concrete classes called Car and Bicycle that inherit from Vehicle.
C Sharp (C#)
Hint
Use : Vehicle to inherit. Override the Move() method in both classes.
3
Create instances of Car and Bicycle
Create variables called myCar and myBike and assign new instances of Car and Bicycle respectively.
C Sharp (C#)
Hint
Use the abstract class type Vehicle for the variables and assign new objects.
4
Call Move() on the instances
Call the Move() method on myCar and myBike and print the output.
C Sharp (C#)
Hint
Call Move() on both variables to see their different behaviors.
Practice
(1/5)
1. Which statement best describes when to use an abstract class in C#?
easy
A. When you want to define a common plan without providing full implementation.
B. When you want to create a fully working class that can be instantiated.
C. When you want to prevent inheritance altogether.
D. When you want to create a class with only static methods.
Solution
Step 1: Understand abstract class purpose
An abstract class defines methods or properties that must be implemented by subclasses but does not provide full implementation itself.
Step 2: Compare with concrete class
Concrete classes provide full working code and can be instantiated, unlike abstract classes.
Final Answer:
When you want to define a common plan without providing full implementation. -> Option A
Quick Check:
Abstract class = common plan without full code [OK]
Hint: Abstract = plan only, Concrete = full working code [OK]
Common Mistakes:
Confusing abstract with concrete classes
Thinking abstract classes can be instantiated
Believing abstract classes provide full method bodies
2. Which of the following is the correct way to declare an abstract class in C#?
easy
A. class abstract Vehicle { }
B. public abstract class Vehicle { }
C. abstract public Vehicle { }
D. public class abstract Vehicle { }
Solution
Step 1: Recall C# syntax for abstract classes
The correct syntax places the keyword abstract before class and then the class name.
Step 2: Check each option
public abstract class Vehicle { } uses public abstract class Vehicle { }, which is correct. Other options have incorrect keyword order or missing keywords.
Final Answer:
public abstract class Vehicle { } -> Option B
Quick Check:
abstract class syntax = 'public abstract class' [OK]
Hint: Use 'abstract' before 'class' keyword [OK]
Common Mistakes:
Placing 'abstract' after 'class'
Omitting 'class' keyword
Incorrect keyword order
3. What will be the output of this C# code?
abstract class Animal {
public abstract void Speak();
}
class Dog : Animal {
public override void Speak() {
Console.WriteLine("Woof");
}
}
class Program {
static void Main() {
Animal a = new Dog();
a.Speak();
}
}
medium
A. Runtime error because Speak is abstract
B. Compile-time error because Animal is abstract
C. Woof
D. No output
Solution
Step 1: Understand abstract method implementation
The abstract method Speak in Animal is overridden in Dog with a concrete implementation that prints "Woof".
Step 2: Analyze runtime behavior
Creating an Animal reference to a Dog object and calling Speak() calls the overridden method, printing "Woof".
Final Answer:
Woof -> Option C
Quick Check:
Abstract method overridden = prints 'Woof' [OK]
Hint: Abstract method must be overridden to run [OK]
Common Mistakes:
Thinking abstract class cannot be referenced
Expecting compile or runtime error
Assuming abstract methods have bodies
4. Identify the error in this code snippet:
abstract class Shape {
public abstract double Area();
}
class Circle : Shape {
public double Area() {
return 3.14 * 5 * 5;
}
}
medium
A. Circle must declare Area() as override
B. Shape cannot have abstract methods
C. Circle cannot inherit from Shape
D. Area method should return int, not double
Solution
Step 1: Check abstract method override rules
When a class inherits an abstract method, it must override it using the override keyword.
Step 2: Identify missing override keyword
The Circle class defines Area() but misses override, causing a compile error.
Final Answer:
Circle must declare Area() as override -> Option A
Quick Check:
Override keyword required for abstract methods [OK]
Hint: Override abstract methods with 'override' keyword [OK]
Common Mistakes:
Omitting override keyword
Thinking abstract methods can be ignored
Confusing return types
5. You want to design a system where all vehicles must have a method StartEngine(), but the way engines start differs by vehicle type. Which approach is best in C#?
hard
A. Create a static class Vehicle with static StartEngine() method.
B. Create a concrete class Vehicle with a fully implemented StartEngine() method for all vehicles.
C. Use an interface with a concrete StartEngine() method and inherit it in all vehicle classes.
D. Create an abstract class Vehicle with abstract method StartEngine(), then implement it in subclasses.
Solution
Step 1: Analyze requirement for different implementations
Since StartEngine() differs by vehicle type, it should be declared abstract to force subclasses to provide their own version.
Step 2: Choose correct class design
An abstract class Vehicle with an abstract StartEngine() method fits best, allowing subclasses to implement specific behavior.
Final Answer:
Create an abstract class Vehicle with abstract method StartEngine(), then implement it in subclasses. -> Option D
Quick Check:
Abstract class for common plan, concrete for specifics [OK]
Hint: Abstract method for varying behavior, concrete class for details [OK]
Common Mistakes:
Using concrete class with one method for all vehicles
Trying to put method body in interface (not allowed)