Xamarin: protocolos de objective c bindings que devuelven protocolos

Tengo los siguientes 2 protocolos en mi aplicación:

@protocol DisplayItem<NSObject> - (void) itemSelected:(NSString*) itemId; @end @protocol DisplayerFactory <NSObject> - (UIViewController<DisplayItem>*) createItemDisplayer; @end 

Utilizo Sharpie Objetivo para vincularlos y obtengo el siguiente enlace:

 // @protocol DisplayItem <NSObject> [Protocol, Model] [BaseType(typeof(NSObject))] interface DisplayItem { // @requinetworking -(void)itemSelected:(NSString *)itemId; [Abstract] [Export("itemSelected:")] void ItemSelected(string itemId); } // @protocol DisplayerFactory <NSObject> [Protocol, Model] [BaseType(typeof(NSObject))] interface DisplayerFactory { // @requinetworking -(UIViewController<DisplayItem> *)createItemDisplayer; [Abstract] [Export("createItemDisplayer")] DisplayItem CreateItemDisplayer(); } 

Eso parece razonable. Excepto ahora cuando bash implementar una DisplayerFactory , el método CreateItemDisplayer necesita devolver un DisplayItem y un UIViewController . Dado que DisplayItem se implementa como una class y no podemos tener inheritance múltiple en C #, no puedo tener una class que henetworkinge tanto de UIViewController como de DisplayItem .

Intenté usar IDisplayItem siguiente manera:

 public class MyController : UIViewController, IDisplayItem { // ... } public DisplayItem CreateItemDisplayer() { return new MyController(); } 

Pero eso no se puede comstackr porque MyController no es un DisplayItem . Si cambio el tipo de método a IDisplayItem , no se comstackrá porque no implemento la interfaz IDisplayerFactory correctamente (o IDisplayerFactory DisplayerFactory).

¿Cómo UIViewController esto para que pueda devolver un UIViewController que implementa el protocolo?

Bind lo siguiente:

 interface IDisplayItem {} // @protocol DisplayerFactory <NSObject> [Protocol, Model] [BaseType(typeof(NSObject))] interface DisplayerFactory { // @requinetworking -(UIViewController<DisplayItem> *)createItemDisplayer; [Abstract] [Export("createItemDisplayer")] IDisplayItem CreateItemDisplayer(); } 

y ahora este código funcionará, ya que CreateItemDisplayer devuelve una interfaz:

 public class MyController : UIViewController, IDisplayItem { // ... } public IDisplayItem CreateItemDisplayer() { return new MyController(); }