C# Foreach sur une List<> de classes héritées

Résolu/Fermé
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 23 juil. 2011 à 18:49
Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 - 24 juil. 2011 à 11:20
Bonjour,
depuis quelque temps (30 minutes pour tout vous dire) je suis confronté à un problème d'héritage de classe:
J'ai créé ma classe "principale":
class Shader
{
    public string ShaderName = "Base shader";
    public Bitmap ApplyShader(Bitmap SrcImage) { return SrcImage; }
}

J'ai créé une autre classe "GaussianBlur" a partir de celle-ci:
class GaussianBlur : Shader
{
    new public string ShaderName = "Gaussian Blur";
    new public Bitmap ApplyShader(Bitmap SrcImage) { /* Gros bout de code */ }
}

J'ai créé une classe qui fait office List de shaders comme ceci:
class ShaderList : System.Collections.Generic.List<Shader>

Je m'occupe de la remplir avec un shader GaussianBlur, puis j'effectue un foreach sur celle-ci:
foreach(Shader _Shader in _ShaderList)

Et c'est ici que le problème se pose:
Pour vérifier le bon fonctionnement du programme, je mets des petites lignes de Console.WriteLine un peu partout. Une d'entre elles est chargée de me dire le nom du shader qui va être appliqué, elle se situe dans le foreach.
Sauf que, comme l'objet qui sort de la liste est un objet Shader, quand la ligne essaie de me sortir le nom du shader (_Shader.ShaderName), il me sort "Base shader" et non "Gaussian Blur".
Donc le shader censé être appliqué n'est pas le Gaussian Blur prévu dans la liste mais bien le shader de base (qui ne transforme en rien l'image).

Pouvez-vous m'éclairer s'il vous plait?

Merci d'avance!


A voir également:

1 réponse

Nico# Messages postés 323 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 28 août 2013 102
24 juil. 2011 à 11:20
Slt,

Voila ce que je ferrai a ta place

je créer une interface IShader
 public interface IShader
    {
        string ShaderName { get; }
        Bitmap ApplyShader(BitmapSource);
    }


Puis ta liste generic je la ferai sur ce IShader

public class ShaderList:System.Collections.Generic.List<IShader>
    {
        
    }


Ton GaussianBlur derive de IShader

public class GaussianBlur : IShader
    {
        
      

        #region Implementation of IShader

        public string ShaderName { get { return "GaussianBlur"; }}
// et pareil pour la methode...
        #endregion
    }


enfin dans ton foreach

ShaderList shaderList = new ShaderList();
            shaderList.Add(new GaussianBlur());

            foreach (var sha in shaderList)
            {
                Console.WriteLine(sha.ShaderName);
                // sha.ShaderName vaut bien GaussianBlur 
            }

            Console.ReadLine();


Et voila tu repete la meme chose pour autant de shader que tu veut tu moment que tu derive de IShader
0