У меня есть этот вид кода:
public class Foo
{
public SomeHandler OnBar;
public virtual void Bar()
{
}
}
Нечто является базовым классом, и для этого другие классы могли бы наследоваться ему.
Я хотел бы OnBar
событие, которое всегда будет запускаться, когда Bar()
назван, даже если это не называют явно внутренней Панелью.
Как это может быть сделано?
Общим шаблоном является наличие невиртуального метода, который делает то, что вы хотите, и вызывает виртуальный метод. Подклассы могут переопределить внутренний метод, чтобы изменить функциональность, но публичный метод может быть невиртуальным и всегда первым вызывать событие.
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
if (OnBar != null)
{
OnBar(this, EventArgs.Empty);
}
BarImpl();
}
protected virtual void BarImpl()
{
}
}
Короткий ответ: вы не можете. Не с тем, что Microsoft дает вам из коробки.
Учитывая это, посмотрите на "аспектно-ориентированное программирование" в .NET. Погуглите, возможно, вы почерпнете что-то полезное.
Добавлено: Стандартным способом было бы вызвать событие в методе Bar()
, а затем потребовать от всех производных классов вызывать базовую реализацию. Но вы не можете добиться этого.
Как сказал Vilx-, я думаю, что лучший способ делать такие вещи - это использовать Аспектно-ориентированное программирование.
Это поможет вам справиться с проблемами "запутанного кода" (т.е. вызов события в методе, который не должен иметь такой ответственности) и "разрозненного кода" (т.е. вызов одного и того же события во многих методах, дублируя ваш код).
Вам стоит взглянуть на postsharp, у него есть бесплатная версия для сообщества.
во-первых, код, который вы предоставили, не скомпилируется.
виртуальные функции должны иметь тело.
Чтобы убедиться, что событие сработало, вы можете сделать что-то вроде этого.
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
OnBar(); (check for nulls)
ProtectedBar();
}
protected virtual ProtectedBar()
{
}
}