2015-11-09 2 views
3

Я пытаюсь расширить определенный класс (скажем, StackPanel WPF). Назовем это расширение MyGenericPanel. Я предполагаю, что его заявление должно быть:Как ограничить тип общего расширения

class MyGenericPanel : StackPanel 

... Но если я хочу, это расширение для хранения переменной типа ссылки (скажем, T) декларация стала бы:

class MyGenericPanel<T> : StackPanel 

А что, если я хочу ограничьте тип T идентифицируемым ... где Идентифицируемым является другой класс.

class MyGenericPanel<T> where T: Identifiable, StackPanel 

жалуется, что StackPanel должен прийти первым ... если я ставлю

class MyGenericPanel<T> where T: StackPanel, Identifiable 

компилятор жалуется Опознаваемая должны прийти до StackPanel.

Bottomline:

  1. MyGenericPanel расширяет StackPanel
  2. T является продолжением идентифицируемых
  3. MyGenericPanel не имеет определения XAML ... Это C# код только.

Как я могу это сделать? ... (или это может быть сделано?)

+0

Все это становится гораздо яснее, когда вы просто всегда поставить общий тип ограничение на собственную линию. – Servy

ответ

0

А что, если я хочу, чтобы ограничить T быть типа идентифицирующего ... где Опознаваемых другого класс

хорошо, если Identifiable и StackPanel - это классы, которые не могут работать, потому что ставить 2 типа типа означает множественное наследование, что не разрешено в C#. Вот почему компилятор жалуется на ваши ограничения.

Если вы имеете в виду, чтобы ваш MyGenericPanel<T> расширить функциональные возможности StackPanel и ограничить T быть типа Identifiable, то следующий будет работать:

class MyGenericPanel<T> : StackPanel where T : Identifiable 
+0

Вот и все.Большое спасибо. Я хотел бы ограничить тип T идентификатором, в то время как MyGenericPanel является расширением StackPanel –

2

MyGenericPanel расширяет StackPanel

T является продолжением Identifiable

переведены на

class MyGenericPanel<T> : StackPanel where T : Identifiable 
4

Я думаю, вы сбиваете с толку спецификацию базы класс с общим ограничением по типу:

class MyGenericPanel<T> : StackPanel where T: Identifiable 

Класс, который приходит после того, как MyGenericPanel<T> : базовый класс, класс после where T: является общим ограничением по типу

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