Default interface methods let you add new methods to interfaces with a basic implementation. This helps avoid breaking old code when interfaces change.
Default interface methods in C Sharp (C#)
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
C Sharp (C#)
public interface IExample { void ExistingMethod(); void NewMethod() { // default implementation Console.WriteLine("Default behavior"); } }
Default methods have a body inside the interface.
Classes implementing the interface can override the default method or use it as is.
Examples
LogWarning that prints a warning message.C Sharp (C#)
public interface ILogger { void Log(string message); void LogWarning(string message) { Console.WriteLine("Warning: " + message); } }
ILogger and uses the default LogWarning method without overriding it.C Sharp (C#)
public class ConsoleLogger : ILogger { public void Log(string message) { Console.WriteLine("Log: " + message); } // Uses default LogWarning method }
LogWarning method with its own version.C Sharp (C#)
public class CustomLogger : ILogger { public void Log(string message) { Console.WriteLine("Log: " + message); } public void LogWarning(string message) { Console.WriteLine("Custom Warning: " + message); } }
Sample Program
This program shows two classes implementing an interface with a default method. One class uses the default method, the other overrides it.
C Sharp (C#)
using System; public interface IGreet { void SayHello(); void SayGoodbye() { Console.WriteLine("Goodbye from default method!"); } } public class Person : IGreet { public void SayHello() { Console.WriteLine("Hello from Person!"); } // Uses default SayGoodbye method } public class FriendlyPerson : IGreet { public void SayHello() { Console.WriteLine("Hello from FriendlyPerson!"); } public void SayGoodbye() { Console.WriteLine("Goodbye from FriendlyPerson override!"); } } class Program { static void Main() { IGreet p1 = new Person(); IGreet p2 = new FriendlyPerson(); p1.SayHello(); p1.SayGoodbye(); p2.SayHello(); p2.SayGoodbye(); } }
Important Notes
Default interface methods were introduced in C# 8.0.
They help keep interfaces flexible and backward compatible.
Use default methods carefully to avoid confusing implementations.
Summary
Default interface methods let interfaces have method bodies.
Classes can use or override these default methods.
This feature helps add new methods without breaking old code.
Practice
1. What is the main purpose of default interface methods in C#?
easy
Solution
Step 1: Understand interface limitations before default methods
Interfaces could only declare methods without bodies, forcing all implementations to define them.Step 2: Recognize the role of default interface methods
Default interface methods allow interfaces to provide a method body, so implementing classes can use or override it.Final Answer:
Allow interfaces to have method bodies with default behavior -> Option AQuick Check:
Default interface methods = method bodies in interfaces [OK]
Hint: Default interface methods add bodies to interfaces [OK]
Common Mistakes:
- Thinking interfaces cannot have any method bodies
- Confusing default methods with abstract methods
- Believing all methods must be overridden
2. Which of the following is the correct syntax to declare a default interface method in C#?
easy
Solution
Step 1: Recall default method syntax in interfaces
Default interface methods can have bodies using either block or expression-bodied syntax.Step 2: Identify correct syntax among options
void Show() => Console.WriteLine("Hello"); uses expression-bodied syntax correctly inside interface method declaration.Final Answer:
void Show() => Console.WriteLine("Hello"); -> Option DQuick Check:
Default method syntax = method with body in interface [OK]
Hint: Default methods have bodies, unlike abstract declarations [OK]
Common Mistakes:
- Using 'default' keyword before method
- Omitting method body
- Writing method body without braces or expression syntax
3. What will be the output of this code?
interface IExample { void Show() => Console.WriteLine("Default"); }
class Test : IExample { }
var t = new Test();
t.Show();medium
Solution
Step 1: Check if class implements Show()
Class Test does not implement Show(), but interface provides default implementation.Step 2: Understand default method usage
Since Test inherits IExample, it uses the default Show() method from interface.Final Answer:
Default -> Option CQuick Check:
Default method runs if not overridden [OK]
Hint: If not overridden, default interface method runs [OK]
Common Mistakes:
- Assuming missing implementation causes error
- Expecting runtime error without override
- Thinking interface methods can't have bodies
4. Identify the error in this code snippet:
interface ICalc { int Add(int a, int b) => a + b; }
class Calc : ICalc { public int Add(int a, int b); }medium
Solution
Step 1: Check Calc class Add method declaration
Calc declares Add with a semicolon but no body, which is invalid in a class.Step 2: Understand method implementation requirements
Class methods must have bodies unless abstract; here Add is not abstract, so body is required.Final Answer:
Missing method body in Calc's Add method -> Option AQuick Check:
Class methods need bodies unless abstract [OK]
Hint: Class methods need bodies unless marked abstract [OK]
Common Mistakes:
- Thinking interface can't have bodies
- Forgetting to add method body in class
- Assuming method should be static
5. Given this interface and classes:
What will be the output of:
interface ILogger { void Log(string msg) => Console.WriteLine($"Log: {msg}"); }
class FileLogger : ILogger { public void Log(string msg) => Console.WriteLine($"File: {msg}"); }
class ConsoleLogger : ILogger { }What will be the output of:
ILogger logger1 = new FileLogger();
ILogger logger2 = new ConsoleLogger();
logger1.Log("Test1");
logger2.Log("Test2");
hard
Solution
Step 1: Analyze FileLogger's Log method
FileLogger overrides Log to print "File: {msg}".Step 2: Analyze ConsoleLogger's Log method
ConsoleLogger does not override Log, so uses interface default "Log: {msg}".Step 3: Predict output for each logger
logger1.Log("Test1") prints "File: Test1"; logger2.Log("Test2") prints "Log: Test2".Final Answer:
File: Test1 Log: Test2 -> Option BQuick Check:
Override changes output; default runs if no override [OK]
Hint: Override changes output; default runs if no override [OK]
Common Mistakes:
- Assuming both use default method
- Expecting compilation error due to default method
- Confusing which method runs
