2017-10-05 1 views
-1

Existe-t-il un moyen pour une interface de renvoyer des vides ainsi que des classes?Autoriser une interface à renvoyer une classe en C#

Interface

public interface IAnimalSlide<C> where <C>:ImageViewer 
{ 
    void endShow(); 
    imageViewer displayImage(); 
    void setNewImage(); 
} 

CatSlide

public class Cat: IAnimalShow 
... 

public System.Windows.Controls.ImageViewer displayImage(){ 
    return displaySingeImage(); 
} 

ImageSlideShow

public class SlideShow 
{ 
    IAnimalSlide = prevSlide; 
    IAnimalSlide = nextSlide; 
    List<IAnimalSlide> animalList; 
} 

... 
animalList.catList.ToList<IAnimalSlide>(); //where catList is a list of Cats 
Canvas.showImage(IAnimalSlide.displayImage()); 

Je reçois actuellement une erreur qui dit

L'utilisation d'un type générique 'IAnimalSlide' nécessite 1 type d'arguments

L'ImageSlideShow appelle une classe appelée ImageViewer et je souhaite l'appeler dans l'interface. Y a-t-il un moyen d'intégrer cette classe dans l'interface?

Répondre

2

L'utilisation d'un type générique 'IAnimalSlide' exige 1 type d'arguments

L'erreur est parce que votre IAnimalSlide générique requiert un type de compilation à déclarer chaque fois qu'il est utilisé:

IAnimalSlide<ImageViewer> slide; 

Mais on ne sait pas exactement ce que vous demandez exactement. Vous pouvez « permettre une interface de retourner un type » en retournant le type de l'interface:

public interface IAnimalSlide 
{ 
    void EndShow(); 
    ImageViewer DisplayImage(); // <-- Note the casing of the return type 
    void SetNewImage(); 
} 

Il n'y a pas de contrainte que l'interface doit être générique (si c'est ce que vous demandez).

NOTE: J'ai volontairement fait les noms de méthode Pascal cas parce que c'est la pratique courante en C# (ce n'est pas Java, mec). Voir Capitalization Conventions.

+1

Merci pour la note à la fin. – Mitch

2

Vous avez quelques petites choses ici. D'abord, votre interface générique n'utilise pas l'argument de type générique C. Si vous utiliserez différentes classes dérivées de ImageViewer, vous utilisez ce qui suit:

public interface IAnimalSlide<TImageViewer> 
    where TImageViewer : ImageViewer 
{ 
    void endShow(); 
    void setNewImage(); 
    TImageViewer displayImage(); 
} 

Notez que le type utilisé pour ImageViewer dans l'interface est l'argument de type générique (que je renomme pour le rendre plus descriptif). Ensuite, lorsqu'ils sont référencés, vous devez inclure un type dérivé de (ou est) ImageViewer:

IAnimalSlide<ImageViewer> 

Cependant, il semble que vous voulez juste utiliser un ImageViewer et ne sera pas en utilisant les classes dérivées de celui-ci, dans lequel Si vous n'avez pas besoin d'une interface générique, il suffit de retirer le arugment de type générique et spécifier le type ImageViewer de retour pour la méthode displayImage:

public interface IAnimalSlide 
{ 
    void endShow(); 
    void setNewImage(); 
    ImageViewer displayImage(); 
} 

Vous allez rencontrer d'autres problèmes basés sur le reste de votre code, mais cela ne devrait vous aller au-delà de l'erreur dans votre question .