Pregunta

Tengo una clase base que hace cálculos en tamaños de imagen. Estoy derivando una clase de eso y tengo tamaños de imagen predefinidos que se utilizarán en mi código. Mientras que lo que tengo funciona, tengo la fuerte sensación de que no lo estoy haciendo correctamente.

Idealmente, me gustaría pasar derviedclass.previewSize como el parámetro para GetWidth sin tener que crear una instancia de él.

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; } }
    }
}
¿Fue útil?

Solución

Me parece que quieres una implementación más flexible de ISize - Tener una implementación que siempre Devuelve el mismo valor parece bastante inútil. Por otro lado, puedo ver que desea una manera fácil de obtener el tamaño que siempre usa para una vista previa. Lo haría así:

// 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;
    }
}

Entonces podrías escribir:

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

d.Save(userId, FixedSize.Preview);

Esto reutilizaría la misma instancia de FixedSize Siempre que lo llamas.

Otros consejos

Hay algunas maneras en que podrías hacer esto, dependiendo de tus necesidades. Miraría hacer una interfaz diferente, configuración. Algo como esto.

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
    }
}

Luego, con esto hecho, en realidad podrías trabajar con él de esta manera.

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

Esta es solo una forma de hacerlo, me gusta de esta manera, ya que puede crear fácilmente una clase de fábrica alrededor de esto que lo ayude a declarar las instancias según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top