#.net #design-patterns
#.net #шаблоны проектирования
Вопрос:
Итак, у меня есть метод, который я хочу вызывать каждый раз, когда определенный объект, в данном случае a Form
, вызывает определенное событие, в данном случае FormClosing
. Теперь, что я мог бы сделать, это создать, MyForm
который наследует Form
, а затем делает то, что мне нужно, что-то вроде
//Not Sure if this is 100% how you would do this but you get the idea
private void formClosing(Object sender, FormClosingEventArgs e)
{
MyMethod(this);
RaiseEvent MyFormClosing;
}
Однако, что, если я не хочу делать вышеупомянутое. Существует ли какая-либо структура или шаблон, которые в принципе позволили бы мне внедрить желаемое поведение в код?
Если это недостаточно ясно, я могу объяснить подробнее.
Комментарии:
1. Почему вы не подписываетесь на событие?
2. @Haplo, это не совсем то, о чем я спрашиваю, это не только для одного объекта. Это было бы для всех объектов, унаследованных от базового типа.
Ответ №1:
Будет ли достаточно добавить свойство, которому вы можете присвоить значение true или false, к классу MyForm, чтобы указать ему не вызывать метод? Лично я бы переопределил метод закрытия, а не подписался на событие.
protected override void OnFormClosing(FormClosingEventArgs e)
{
if(CallMyMethod)
{
MyMethod(this);
}
base.OnFormClosing(e);
}
Если myMethod является внешним по отношению к форме, вы можете вместо этого использовать делегаты (возможно, также лучшее именование)
public Action<Form> MyMethod { get; set; }
protected override void OnFormClosing(FormClosingEventArgs e)
{
if(MyMethod != null)
{
MyMethod(this);
}
base.OnFormClosing(e);
}
но на самом деле, поскольку это форма, если вы хотите вызвать внешний метод, было бы лучше подписаться на событие закрытия форм.
** Правка операции **
Это было достаточно близко, чтобы привести меня к тому, к чему я хотел, а именно к созданию частичного класса, унаследованного от Form
, и переопределению событий там, чтобы делать то, что я хотел.
Комментарии:
1. Я пытаюсь избежать использования базового класса. В принципе, я хочу иметь возможность внедрять такое поведение в класс по умолчанию
Form
.2. это фактически привело меня туда, куда я хотел пойти. Я отредактировал то, что я сделал в вашем ответе