2015-07-31 4 views
2

Предположим, у меня есть класс под названием UIViewController.C#: параметр метода, реализующий конкретный интерфейс

public class UIViewController 
{ 
    // ... methods 
} 

И у меня есть интерфейс IDoFancyFlips

public interface IDoFancyFlips 
{ 
    // ... methods 
} 

У меня есть классы, которые расширяют UIViewController и реализуют интерфейс следующим образом.

public class FancyViewController : UIViewController, IDoFancyFlips 
{ 
    // ... methods 
} 

Теперь я хочу написать метод, который принимает UIViewController в качестве параметра, а только те, которые реализуют IDoFancyFlips.

public void FlipAndShow(??? controller) { 
    // implementation 
} 

Мой вопрос: что мне положить в ???. Кажется, я не мог найти способ сделать это.

Я могу сделать это в Objective C следующим образом:

- (void) flipAndShow:(UIViewController<IDoFancyFlips>*) controller { 
    // implementation 
} 

Но я не могу найти эквивалентное заявление в C#.

+4

'общественная пустота FlipAndShow (T контроллер), где T: UIViewController, DoFancyFlips {...}' Если это сделать. –

ответ

4

Для достижения этой цели вы можете использовать дженерики. Попробуйте следующее:

public void FlipAndShow<TFancyFlippingController> 
     (TFancyFlippingController fancyFlippingController) 
    where TFancyFlippingController : UIViewController, IDoFancyFlips 
{ 
    // implementation 
} 

where TFancyFlippingController : UIViewController, IDoFancyFlips ограничение гарантирует, что аргумент, указанный для TFancyFlippingController оба должны наследовать от UIViewController и реализовать интерфейс IDoFancyFlips.

+1

@Rahul Прошу прощения, что вы ошибаетесь. Общее ограничение, безусловно, может быть конкретным именем класса. Попробуйте сами. Я использую конкретные ограничения класса все время. Я думаю, вы имели в виду, что ограничение не может быть закрытым классом. Это правда. –

+1

@Rahul вы, вероятно, путаете его с общим ограничением против «запечатанных» классов (что вполне разумно, поскольку у вас никогда не будет более одного типа, и в этом случае нет никаких дженериков) –

0

Учитывая, что все ваш конкретный контроллер представления наследует от базового класса UIViewController

public class FancyViewController : UIViewController, DoFancyFlips 
{ 
    // ... methods 
} 

public class NormalViewController : UIViewController 
{ 
    // ... methods 
} 

вы можете проверить во время выполнения ли переданная экземпляр имеет типа DoFancyFlips, а затем сделать обработку дальнейшей; как

public static void FlipAndShow(UIViewController controller) 
    { 
     if (!(controller is DoFancyFlips)) 
      return; 

     // implementation 
    } 
+0

Разница между этим и общим методом заключается в том, что это является ошибкой во время выполнения, общий метод - это ошибка времени компиляции. Думаю, это важное различие. –

+1

Да, я знаю, что смогу это сделать во время работы. Я хочу проверить время компиляции. –

+1

@RonBeyer, да, это будет проверка времени выполнения, но не должно быть никакой ошибки, так как оператор 'is' просто заканчивается на true/false, и функция вернется к вызывающему абоненту соответственно. – Rahul

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