2016-08-06 6 views
-1

У меня есть WrapperBase<PocoBase> класса, который обертывает объекты POCO и обеспечивает дополнительные функциональные возможности:Как я могу указать BaseType <any>?

public class WrapperBase<T> 
where T : PocoBase 

и несколько реализаций на вершине этого базового класса.

public class ButtonWrapper : WrapperBase<Button> 
public class ZipperWrapper : WrapperBase<Zipper> 

Я пытаюсь написать класс, который принимает WrapperBase<T> в качестве параметра конструктора.

public class ThingDoer 
    where T : PocoBase 
{ 
    public ThingDoer(WrapperBase<T> wrapper) 
    { 
    } 
} 

, но независимо от того, что я стараюсь, то ThingDoer хочет определение T:

new ThingDoer<Zipper>(zipperWrapper); 
// I don't care what T is... get rid of <Zipper> 

Как я могу сказать: «Я не волнует, что T это, потому что все функциональные возможности, я хочу, в WrapperBase "?

+1

При работе с дженериками вы должны представить, что '<' and '>' - это просто часть имени. Представьте себе, что у вас были два класса, которые были определены как «открытый класс ButtonWrapper: WrapperBase_Button» и «public class ZipperWrapper: WrapperBase_Zipper», подумайте о своем вопросе снова, вы не можете просто «WrapperBase», потому что у вас нет класса с именем 'WrapperBase', у вас есть два класса с именем' WrapperBase_Button' и 'WrapperBase_Zipper', которые не имеют ничего общего друг с другом, кроме того, что они имеют одни и те же первые 12 букв в их имени. –

ответ

2

Как я могу сказать: «Меня не волнует, что такое T, потому что вся функциональность, которую я хочу, находится в WrapperBase»?

Вы можете определить интерфейс IWrapperFunctionality, который определяет методы, обеспечивающие эту функциональность. Имейте WrapperBase<T> реализовать этот интерфейс и использовать его в качестве аргумента конструктора.

public ThingDoer(IWrapperFunctionality wrapper) 
{ 
} 
Смежные вопросы