I would choose to state that Event Dispatchers are an efficient way to have blueprints communicate.
For the reference it’s back to ownership logic, if you use it and own it make it a variable.
The Interface is as you have suggested, to provide a common programming interface for a set of objects, not directly related to communication, but can be used to communicate.
Casting has no place in this conversation about communication, in my opinion.