"Kelas abstrak" dan "antarmuka" adalah konsep yang serupa, dengan antarmuka menjadi lebih abstrak dari keduanya. Salah satu faktor pembeda adalah bahwa kelas abstrak menyediakan implementasi metode untuk kelas turunan saat dibutuhkan. Namun dalam C #, faktor pembeda ini telah dikurangi dengan pengenalan metode ekstensi baru-baru ini, yang memungkinkan implementasi disediakan untuk metode antarmuka. Faktor pembeda lainnya adalah bahwa suatu kelas dapat mewarisi hanya satu kelas abstrak (yaitu, tidak ada pewarisan berganda), tetapi dapat menerapkan banyak antarmuka. Ini membuat antarmuka menjadi kurang ketat dan lebih fleksibel. Jadi, di C #, kapan kita harus menggunakan kelas abstrak alih-alih antarmuka dengan metode ekstensi?
Contoh penting dari model metode antarmuka + ekstensi adalah LINQ, di mana fungsionalitas kueri disediakan untuk semua jenis yang mengimplementasikan IEnumerable
melalui banyak metode ekstensi.