C# static member “inheritance” – why does this exist at all?

So, the “inheritance” of static
members merely looks like namespace
pollution

That’s right, except that one guy’s pollution is another guy’s added spicy flavouring.

I think Martin Fowler, in his work on DSLs, has suggested using inheritance in this way to allow convenient access to static methods, allowing those methods to be used without class name qualification. So the calling code has to be in a class that inherits the class in which the methods are defined. (I think it’s a rotten idea.)

In my opinion, static members should not be mixed into a class with a non-static purpose, and the issue you raise here is part of the reason why it’s important not to mix them.

Hiding private static mutable data inside the implementation of an otherwise “instancey” class is particularly horrible. But then there are static methods, which are even worse mixers. Here’s a typical use of static methods mixed into a class:

public class Thing
{
    // typical per-instance stuff
    int _member1;
    protected virtual void Foo() { ... }
    public void Bar() { ... }

    // factory method
    public static Thing Make()
    {
        return new Thing();
    }
}

It’s the static factory method pattern. It’s pointless most of the time, but even worse is that now we have this:

public class AnotherThing : Thing { }

This now has a static Make method which returns a Thing, not a AnotherThing.

This kind of mismatch strongly implies that anything with static methods should be sealed. Static members fail to integrate well with inheritance. It makes no sense to have them heritable. So I keep static things in separate static classes, and I gripe about redundantly having to declare every member static when I’ve already said that the class is static.

But it’s just one of those too-late-now things. All real, working languages (and libraries, and products) have a few of them. C# has remarkably few.

Leave a Comment