Why does MonoBehaviour not allow message functions to be overridden?

I constantly forget what the message functions names are when working with Unity, i.e Awake, Start, OnEnable etc. So for 20 minutes the other day I had an OnEnabled function and was wondering why it was not being invoked, whereas it should have been OnEnable, however there is no interface or virtual method indicating that you should override it if you want to be able to hook into these events.

So I was just wondering is there a particular reason why these methods are not virtual or at least already defined in some way for you to know what they are and override them?

I will assume they are not virtual because of the overhead of virtual methods, and they cannot be abstract because then you are forced to implement them, and finally are not on an interface and empty because then you would need to do some funky new function over the top of the other.

It just seems that there should be a better way to do this without me needing a cheat sheet to see what methods unity will allow me to hook into, especially as c# provides such good intellisense these days.

What do you mean “there is no interface” ? Does the documentation for Monobehaviour not count? Unity - Scripting API: MonoBehaviour

You’re right about not using virtual methods to reduce needless overhead, and that’s why Unity uses reflection, which is just a fancy way of saying that Unity only calls on the methods if they are implemented. If they aren’t implemented, then they aren’t called at all.