Здравствуйте, _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".
Знаю, но привык так писать в идентификаторах