2013-04-14 2 views
0

Je tente donc de rendre abstraits certains modèles de vue/vue WPF dans des objets réutilisables découplés. Et maintenant je suis coincé de telle sorte que je ne suis même pas sûr de ce qu'il faut essayer ensuite. J'espère que quelqu'un là-bas peut aider à débloquer mon cerveau.Héritage générique et conversion de type

Voici un exemple simplifié et l'erreur

public interface IBasicListDto{} 

    public interface IBasicListVm<T> where T : IBasicListDto 
    { 
     void DoSomthing(); 
    } 

    public class BasicListVm<T> : IBasicListVm<T> where T : IBasicListDto 
    { 
     public void DoSomthing() 
     { 
      Console.WriteLine("woohoo!!"); 
     } 
    } 

    public class MyBasicListDto : IBasicListDto{} 

    public class MyBasicListVm<T> : BasicListVm<T> where T : MyBasicListDto {} 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     IBasicListVm<IBasicListDto> vm = (IBasicListVm<IBasicListDto>)new MyBasicListVm<MyBasicListDto>(); 
     vm.DoSomthing(); 
    } 

Je reçois l'erreur d'exécution suivante sur la première ligne dans la méthode Button_Click.

System.InvalidCastException était unhandled HResult = -2147467262 Message = Incapable de coulée objet de type 'MyBasicListVm 1[testGenericInheritance.MainWindow+MyBasicListDto]' to type 'IBasicListVm 1 [testGenericInheritance.MainWindow + IBasicListDto]. Source = testGenericInheritance StackTrace:

J'ai vu quelques questions/réponses similaires, mais mon cerveau est tout simplement pas « Getting it » assez pour faire les changements nécessaires.

+1

Le problème fondamental est la propriété quelque peu contre-intuitif où, si vous avez les types 'Parent' et son sous-type' Child', puis '' SomeGenericType ** n'est pas * * un sous-type de 'SomeGenericType '. (La raison en est fondamentale, si le principe de substitution de Liskov était violé.) – millimoose

Répondre

0

Vous pouvez faire IBasicListVm<T> covariant:

public interface IBasicListVm<out T> where T : IBasicListDto 
{ 
    void DoSomthing(); 
} 
+0

wow c'était une réponse rapide, tyvm – Wieknot

+0

Cela semble invalider les délégués et les événements définis dans la "vraie" version de l'interface . – Wieknot

+1

@Wieknot Cela signifie probablement que votre conception n'a pas de sens quelque part et qu'elle ne peut pas être sécurisée. – millimoose

Questions connexes