Re[2]: Проблема с циклической ссылкой generic классов
От: Silentor Украина  
Дата: 26.06.11 22:26
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Silentor, Вы писали:


S>>Пишу некий фреймворк. Там имеются базовые классы парента BaseParent и чайлдов BaseChild. В паренте я хочу иметь список чайлдов, а в чайлде — ссылку на парента. Пишу через generic'и:

_FR>
S>>public abstract class BaseParent<TChild>
S>>        where TChild : BaseChild<BaseParent<TChild>>
S>>    {
S>>        protected List<TChild> _childs = new List<TChild>();
S>>    }

S>>public abstract class BaseChild<TParent>
S>>        where TParent : BaseParent<BaseChild<TParent>>
S>>    {
S>>        protected TParent _parent;
S>>    }
_FR>


_FR>Вам действительно нужны в базовых классах фреймворка защищённые поля? Вам известен какой-либо [разумный] сценарий, который потребует этого?

_FR>Какие конкретно вызовы у "детей" будет делать ваш BaseParent? А "дитё" у родителя? Или это просто так связь, "для наглядности"? Нужно ли в этих вызовах знать чей-либо конкретный тип?
Надеялся избежать этого вопроса Parent на самом деле сервис, предоставляющий набор базовых операций. Child обслуживает подключение клиента, реализует базовый контракт. Класс сервиса и класс клиента наследуется и расширяется, туда добавляются новые операции.
Пускай у нас будет
abstract class BaseService

, реализующий некий базовый функционал, общий для всех сервисов проекта: создает WCF ServiceHost, привязывает эндпоинт на контракт IBaseWcfContract, настраивает сервис-хост так, чтобы когда к нам стукает клиент, создавался объект BaseClient, при наступлении определенных условий оповещает подключенных BaseClient. Вот его класс:
abstract class BaseClient : IBaseWcfContract

, где IBaseWcfContract — WCF ServiceContract с базовым набором ServiceOperation, а сам BaseClient хранит состояние клиента, обслуживает запросы согласно контракту, при необходимости дергая BaseService, передавая ему параметры, переданные клиентом + своё собственное состояние и отдавая результат обратно клиенту. Также передавая клиенту оповещения сервиса через Callback-интерфейс.
Задача состоит в том, чтобы была возможность написать
class MyService : BaseService

, реализующий несколько дополнительных методов, и
class MyClient : BaseClient, IMyWcfContract

реализующий несколько дополнительных операций, описанных в IMyWcfContract. Эти операции будут дёргать новые методы MyService. Работа в базовых BaseService и BaseClient будет идти без изменений и должна быть скрыта от пользователя, но, к примеру, эндпоинт должен привязываться к IMyWcfContract, на подключение клиента должен создаваться экземпляр класса MyClient, сервис должен иметь список подключенных MyClient для новых обратных оповещений, а в MyClient должна быть ссылочка на MyService, чтобы использовать новый функционал.

Отсюда вся игра с дженериками и передачами типов туда-сюда. Может есть какой убер-паттерн для таких ситуаций, буду рад узнать
Но ответ камрада Samius
Автор: samius
Дата: 26.06.11
меня полностью устраивает.

_FR>Кстати, child во множественном числе — это children, а не "childs".

Знаю, но привык так писать в идентификаторах
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.