Question

J'ai une classe de base qui fait des calculs sur les tailles d'image. Je tire une classe de cela et j'ai des tailles d'images prédéfinies qui seront utilisées dans mon code. Bien que ce que j'ai fonctionne, j'ai le sentiment fort que je ne le fais pas correctement.

Idéalement, je voudrais simplement passer DervidClass.PreViewSize comme paramètre pour obtenir uneWidth sans avoir à en créer une instance.

class Program
{
    static void Main(string[] args)
    {
        ProfilePics d = new ProfilePics();
        Guid UserId = Guid.NewGuid();

        ProfilePics.Preview PreviewSize = new ProfilePics.Preview();
        d.Save(UserId, PreviewSize);
    }
}

class ProfilePicsBase
{
    public interface ISize
    {
        int Width { get; }
        int Height { get; }
    }

    public void Save(Guid UserId, ISize Size)
    {
        string PicPath = GetTempPath(UserId);
        Media.ResizeImage(PicPath, Size.Width, Size.Height);
    }
}

class ProfilePics : ProfilePicsBase
{
    public class Preview : ISize
    {
        public int Width { get { return 200; } }
        public int Height { get { return 160; } }
    }
}
Était-ce utile?

La solution

Il me semble que vous voulez une implémentation plus flexible de ISize - avoir une implémentation qui toujours Renvoie la même valeur semble assez inutile. D'un autre côté, je peux voir que vous voulez un moyen facile d'obtenir la taille que vous utilisez toujours pour un aperçu. Je le ferais comme ça:

// Immutable implementation of ISize
public class FixedSize : ISize
{
    public static readonly FixedSize Preview = new FixedSize(200, 160);

    private readonly int width;
    private readonly int height;

    public int Width { get { return width; } }
    public int Height { get { return height; } }

    public FixedSize(int width, int height)
    {
        this.width = width;
        this.height = height;
    }
}

Vous pourriez alors écrire:

ProfilePics d = new ProfilePics();
Guid userId = Guid.NewGuid();

d.Save(userId, FixedSize.Preview);

Cela réutiliserait le même cas de FixedSize Chaque fois que vous l'appeliez.

Autres conseils

Il existe plusieurs façons de le faire, selon vos besoins. Je chercherais à faire une interface différente, configuration. Quelque chose comme ça.

public interface ISizedPics
{
    int Width {get; }
    int Height {get; }
    void Save(Guid userId)
}
public class ProfilePics, iSizedPics
{
    public int Width { get { return 200; } }
    public int Height { get { return 160; } }
    public void Save(Guid UserId)
    {
        //Do your save here
    }
}

Ensuite, avec cela fait, vous pouvez réellement travailler avec ça comme ça.

ISizedPics picInstance = new ProfilePics;
Guid myId = Guid.NewGuid();
picInstance.Save(myId);

Ce n'est qu'une façon de le faire, j'aime de cette façon, car vous pouvez facilement créer une classe d'usine autour de cela qui vous aide à déclarer les instances au besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top