Why don't interfaces explicitly define the concept of overridable events?

An interface with a function that has no output will turn into a custom event in the class that implements that interface, which is a bit weird, because in the interface we defined that as a function.

In OOP, interfaces usually define function signatures.

However, in UE, it seems that we want to favour custom events when a function has no output, but why not enhance the concept of interfaces in UE with the concept of overridable custom events, instead of magically turning functions into events as if nothing happened?

Was this just a bad design decision, or is there really a good motivation?

By good motivation, I mean that we can’t actually use non-return value functions from an interface in some case where a class would implement that interface, which seems absurd because I can also implement a function that returns a value and never use it. So, this must be a bad historical design decision that stuck and people never cared about introducing explicit overridable custom events.

Note that I am not asking about the differences between custom events and functions and that in custom events we can have latent nodes, like Delay, it’s not really my point.

A custom event is just a void function. You can implement interfaces without doing anything with the custom events. They exist in the left side interface section if you want to implement them later. Essentially, you are overriding them whenever a class implements them. If a child were to implement the same function the parent already does, you would need a parent call which is essentially a Super::somefunc() call.

IMO it works identical to cpp implementations except you don’t actually have to account for implementation as in other languages/engines (thinking of unity interfaces)

i havent tried with interfaces but see if you can right click on the node and choose ‘Convert Event To Function’ i find functions cleaner too if not latent. option b is just add a bool return node which i often find useful anyway since with interfaces you dont always know if its been ‘handled’

option b is just add a bool return node which i often find useful anyway since with interfaces you dont always know if its been ‘handled’

I, too, just add a bSuccess return on my interface functions

Yeah, you can’t do that for some reason with interface events and it’s really, really, annoying. And makes zero sense.
At least that was true the last time I tried, which was definitely in a 5.something release but I don’t remember exactly.

ah well option c then maybe be to create a new event graph for each interface

Just add a return to your functions.