2013-03-22 5 views
2

Я пытаюсь понять, какая иерархия будет лучшей для наследования, описанной ниже. До сих пор у меня было следующее:Общий абстрактный базовый класс от общего интерфейса

public interface IManager<T> where T : ISomeObject 
{ 
    bool Add(T o); 
    bool Remove(T o); 
    bool Update(T o); 
} 

Но тогда я хотел, чтобы каждый производный класс имел параметризованный конструктор. Поэтому я пошел:

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly INeededObject obj; 

    protected Manager(INeededObject o) 
    { 
     obj = o; 
    } 
} 

Любые идеи о том, как мне решить эту проблему? Заранее спасибо.

ответ

0

Может быть немного поздно ночью «мудрости пик» (который может быть неправильно снова). Но изменил мой интерфейс, чтобы быть необщего один, как следует:

public interface IManager 
{ 
    bool Add(ISomeObject o); 
    bool Remove(ISomeObject o); 
    bool Update(ISomeObject o); 
} 

И мой абстрактный класс выглядит следующим образом:

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly INeededObject obj; 

    protected Manager(INeededObject o) 
    { 
     obj = o; 
    } 

    public abstract bool Add(T o); 
    bool IManager.Add(ISomeObject obj) 
    { 
     return this.Add((T) obj); 
    } 
} 
3

Вы почти у цели. Вы также можете использовать параметры общего типа в своем базовом классе.

public abstract class Manager<T> : IManager<T> where T : ISomeObject 
{ 
    protected readonly T obj; 

    protected Manager(T o) 
    { 
     obj = o; 
    } 
} 

Вы можете использовать параметризованные типы тоже, как

protected Manager(IList<T> o) 
{ 
    ... 
} 
+0

я не знаю, но того, чтобы определить, что 'T' как в' интерфейсе 'и' abstract class' чувствует себя немного странно и неправильно. – Kunal

+0

@ Кунал, вы не 'определяете' 'T' в двух местах. 'T' - это просто имя параметра - вроде как параметр функции. Фактически вы можете дать 'T' любое имя, которое вы хотите в обоих местах, например. 'class Manager '. 'T' - это просто конвенция. –

+0

Да, я понимаю использование дженериков, однако, по-прежнему считаю, что нужно избыточно указывать, какой тип «T», как в «интерфейсе», так и «абстрактном классе», не стоит нигде по линиям OOD. Я согласен с тем, что ваш - один из способов сделать параметризованный конструктор, но мое редактирование - это то, что я искал (если нет недостатка). – Kunal

Смежные вопросы