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

Résolu
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   -  
Nico# Messages postés 323 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   102
 
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