2016-10-01 4 views
2

Je lis la question suivante (et je le résoudre de la même manière que la réponse donnée): Passing derived type as argument to abstract classméthodes génériques et le type de coulée

Mais pourquoi est-il pas en mesure de trouver l'attribut value de la classe dérivée? même si j'ajouter un type moulé, il est impossible:

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found 
     return a.value + b.value; 
    } 

    public float value; 
} 

Exemple de type coulée est également ne fonctionne pas (et les conseils fonte de type redondant est affiché):

public abstract class baseClass 
{ 
    public abstract float function<T>(T a, T b) where T:baseClass; 
} 

public class derived: baseClass 
{ 
    public override float function<derived>(derived a, derived b) 
    { 
     // Here value is not found even with type cast 
     return ((derived)a).value + ((derived)b).value; 
    } 

    public float value; 
} 
+0

Exemple avec le cast de type fonctionne - il est question de nommage. Renommez le paramètre de type générique en 'T', puis vous pouvez convertir en' derived'. – 2kay

+0

@ 2kay merci pour l'indice –

Répondre

2

Parce que vous déclarer le paramètre de type générique sur la méthode. Le compilateur ne comprend pas que cela devrait être du type derived. Tout ce qu'il sait c'est que vous avez introduit un nouveau paramètre de type générique.

Qu'est-ce que vous voulez est appelé F-bound polymorphism, où le paramètre de type est de la classe implémentant, définie récursivement:

public abstract class BaseClass<T> where T : BaseClass<T> 
{ 
    public abstract float Function(T a, T b); 
} 

public class Derived : BaseClass<Derived> 
{ 
    public override float Function(Derived a, Derived b) 
    { 
     return a.Value + b.Value; 
    } 

    public float Value { get; set; } 
} 
+0

Mais ne devrait-il pas savoir le type quand je l'ajoute explicite? –

+0

@KevinWallis Le compilateur ne traite pas 'derived' comme le type' derived' que vous avez créé. De son point de vue, il s'agit d'un * paramètre de type générique appelé «derived», puisque c'est ainsi que 'BaseClass' déclare' Function', avec deux paramètres 'T' de type abstrait. –

+0

D'accord merci pour la réponse! –