Реализация цепочки ответственности с помощью LinkedList - PullRequest
1 голос
/ 04 августа 2011

Мне трудно обдумать это, и я надеюсь, что кто-то может мне помочь.

У меня есть класс Chain of Responsibility, и мне интересно, могу ли я (и хотел бы) реализовать его как производную от класса LinkedList. По своей сути Chain of Responsibility - это, конечно, связанный список, но я не уверен, действительно ли здесь уместно наследование от LinkedList, поскольку каждый реализованный метод должен иметь возможность вызывать один и тот же метод в преемнике текущий сбой.

Можете ли вы реализовать что-то вроде public class MyHandler : LinkedList<MyHandler>? Это похоже на рекурсивное определение, но компилятор не считает это проблемой.

У кого-нибудь есть понимание этого?

1 Ответ

3 голосов
/ 04 августа 2011

Да, вы можете наследовать от LinkedList, точно так же, как вы можете наследовать от любого не запечатанного класса. Тем не менее, я не думаю, что это хорошая идея. Наследование - это не просто повторное использование методов. Оно передает "это" отношение . Хотя схема цепочки ответственности, безусловно, может быть реализована с использованием связанного списка, цепочка ответственности не является связным списком.

При наследовании от класса LinkedList вы будете выставлять все его открытые методы. Вы также должны спросить, все ли эти методы имеют смысл для вашего класса. Я не думаю, что LinkedList.Average() имеет какое-либо значение для цепи ответственности.

Вместо этого вы должны хранить обработчики в связанном списке, который является частным членом данных вашей цепочки ответственности.

Можете ли вы реализовать что-то вроде открытого класса MyHandler: LinkedList? Это похоже на рекурсивное определение, но компилятор не считает это проблемой.

Да, это совершенно законно. Это рекурсивное определение, которое может пригодиться, например, при реализации составного шаблона . Это будет

Я бы не советовал писать этот класс по тем же причинам, по которым ваша цепь ответственности не должна наследоваться от LinkedList, но это возможно.

...