Why can't I use the event declared in Base
from Sub
?
class Program
{
static void Main(string[] args)
{
Sub sub = new Sub();
sub.log += new Base.logEvent(sub_log);
sub.go();
}
static void sub_log(string message, int level)
{
Console.Out.WriteLine(message + " " + level);
}
}
public abstract class Base
{
public delegate void logEvent(String message, int level);
public event logEvent log;
}
public class Sub : Base
{
public void go()
{
log("Test", 1); // <-- this won't compile
}
}
Yes, you can declare events in a base class so that they can also be raised from derived classes.
Create a protected invoking method for the event. By calling this invoking method, derived classes can invoke the event.
Read the standard way to do so here:
How to raise base class events in derived classes
Because events can only be called from the declaring class. Just create a method in the base class to call it:
So you can use it in deriving classes, and even override it.
On another note, I would strongly advise you to follow the design guidelines for events, and create an own EventArgs class, and use the
EventHandler<T>
delegate.Events may only be invoked from the class that declares them.
From outside of the definition of a class (even in a derived class) you can only register and unregister from an
event
. Inside of the class, the compiler only allows you to raise the event. This is a by-design behavior of C# (which actually changes slightly in C#4 - Chris Burrows describes the changes on his blog).What you want to do here is provide a
RaiseLogEvent()
method in the base class, which would allow the derived class to invoke this event.As an aside, you should consider using the
EventHandler<>
delegate type, rather than creating your own event types when possible.