What's the difference between an abstract class and a static one?
static
indicates the class can only have static members and you cannot create an instance of it. This is used for stateless functionality (for example a type that just defines extension methods, or utility methods). You can also declare a member static
on a non-static class. This allows you to attach functionality to a type without having to instantiate it.
Here's more detail on using static members and classes.
abstract
s define the basic structure and functionality shared by all derivative types, but cannot be used by themselves. Think of them as, I suppose, a blue print and a contract. This is a core concept for OOP.
Here's more detail on using abstracts.
Here is a short summary:
- A static class can only contain
static
members (it is just a container for methods that do not logically belong to an instance of any standard class) - An abstract class can contain all usual kinds of members (static, abstract and also instance)
The key difference is that you can inherit from an abstract
class, but you cannot inherit from a static
class. Technically speaking, the .NET runtime doesn't have any notion of static
classes, so the C# compiler compiles them as classes that are both abstract
and sealed
(meaning that you cannot inherit from them).
So, static
classes are abstract
classes that are also sealed
(although this is not the usual way to look at the problem if you are C# programmer) and contain only static
members (which is enforced by the C# compiler).
An abstract class is intended to be used as a base of a class inheritance hierarchy. A static class cannot be the base of a class inheritance hierarchy.
A static class is intended for singleton state or stateless functionality. An abstract class is not suitable for singleton functionality, because, even though it may contain static methods and fields as a static class does, it cannot forbid inheritance, so the singleton use may be defeated by subclasses. Or, at the very least, it would be confusing to other programmers, because its definition would communicate an intent that is different from its actual intended use.
The superficial similarity between abstract and static classes is only in the fact that neither may be instantiated. Beyond that, they are completely different animals with completely different use cases.