An abstract class cannot be instantiated. The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share.
- An abstract class is a special type of a class that cannot be instantiated.
- An abstract class should, however, be inherited by its subclasses.
- Abstract classes are either partially implemented or not implemented at all. You can have functionality in your abstract class — the methods in an abstract class can be both abstract and concrete.
- An abstract class can have constructors — this is one major difference between an abstract class and an interface.
- You may take advantage of abstract classes to design components and specify some level of common functionality in the methods of the abstract class until a specific implementation of the abstract class is needed in the class hierarchy.
- The constructor of an Abstract Class can be called through the derived class constructor.
- All abstract methods must be implemented in its derived class, if inherited.
- We cannot create an object of an interface, we can only create a reference or Interface Variable.
- An interface will have only abstract methods (method declaration).
- Interfaces supports Inheritance, Polymorphism (Overloading, Overriding (using the “new” keyword to hide the interface methods above)).
- We cannot create variables in an interface.
- Only Properties, Indexers, Methods and Events are allowed in an interface.
- A class can inherit multiple interfaces, which is also shown in the snapshot above.
- We cannot create any Access modifiers with Interface Members (like private, public, protected, internal, protected internal, virtual, override, static, abstract etc.)
- The new keyword is allowed in an interface.
- All methods of an interface must be defined in every derived class.
You should use interface if
- You want to simulate inheritant from struct since struct can’t inherit from another struct or class
- If the functionality you are creating will be useful across a wide range of disparate objects
- If you are designing small, concise bits of functionality
You should use abstract class if
- It applies to objects that are closely related
- If you are designing large functional units
- If you want to provide common, implemented functionality among all implementations of your component