दोनों "कॉन्ट्रैक्ट" परिभाषित करते हैं, लेकिन अलग-अलग उद्देश्यों के लिए।
तुलना तालिका
| विशेषता | एब्स्ट्रैक्ट क्लास | इंटरफेस |
|---|---|---|
| विरासत | केवल एक (सिंगल इनहेरिटेंस) | एकाधिक (मल्टीपल इम्प्लीमेंटेशन) |
| मेंबर फील्ड्स | हाँ (इंस्टेंस/स्टैटिक फील्ड्स) | नहीं (केवल C# 8.0+ में डिफ़ॉल्ट इम्प्लीमेंटेशन) |
| एक्सेस मॉडिफायर्स | सभी (public, private, protected, internal) | डिफ़ॉल्ट public (C# 8.0 से पहले), अब private/protected भी |
| कंस्ट्रक्टर | हाँ | नहीं |
| इंस्टेंस बनाना | नहीं (लेकिन डेराइव्ड बना सकता है) | नहीं |
| उद्देश्य | "Is-A" बेस क्लास, साझा कोड | "Can-Do" कॉन्ट्रैक्ट, पॉलीमॉर्फिज़्म |
एब्स्ट्रैक्ट क्लास उदाहरण
public abstract class Animal
{
public string Name { get; set; } // फील्ड/प्रॉपर्टी
public abstract void MakeSound(); // एब्स्ट्रैक्ट मेथड
public void Sleep() => Console.WriteLine("Sleeping..."); // कार्यान्वयन
}
public class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Woof!");
}
इंटरफेस उदाहरण
public interface IAnimal
{
string Name { get; set; }
void MakeSound();
}
public interface IRunnable
{
void Run();
}
// एकाधिक इम्प्लीमेंटेशन
public class Dog : IAnimal, IRunnable
{
public string Name { get; set; }
public void MakeSound() => Console.WriteLine("Woof!");
public void Run() => Console.WriteLine("Running...");
}
C# 8.0+ नया: डिफ़ॉल्ट इम्प्लीमेंटेशन
public interface ILogger
{
void Log(string msg);
void LogError(string msg) => Log($"ERROR: {msg}"); // डिफ़ॉल्ट इम्प्लीमेंटेशन
}
कब क्या चुनें?
- एब्स्ट्रैक्ट क्लास: निकटता से संबंधित क्लासेस, साझा कोड/स्टेट, वर्जनिंग (नए मेथड्स जोड़ने पर डेराइव्ड क्लासेस नहीं टूटतीं)।
- इंटरफेस: असंबंधित क्लासेस के लिए कॉन्ट्रैक्ट, मल्टीपल इम्प्लीमेंटेशन, DI/मॉकिंग, प्लगइन आर्किटेक्चर।