Pergunta

Eu tenho uma classe base que faz cálculos no tamanho das imagens.Estou derivando uma classe disso e tenho tamanhos de imagem predefinidos que serão usados ​​no meu código.Embora o que tenho funcione, tenho uma forte sensação de que não estou fazendo isso corretamente.

Idealmente, gostaria apenas de passar DerviedClass.PreviewSize como parâmetro para GetWidth sem precisar criar uma instância dele.

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

Solução

Parece-me que pretendem uma implementação mais flexível do ISize - ter uma implementação que sempre retorna o mesmo valor parece bastante inútil.Por outro lado, posso ver que você deseja uma maneira fácil de obter o tamanho que sempre usa para uma visualização.Eu faria assim:

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

Você poderia então escrever:

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

d.Save(userId, FixedSize.Preview);

Isso reutilizaria a mesma instância de FixedSize sempre que você ligou.

Outras dicas

Existem algumas maneiras de fazer isso, dependendo de suas necessidades.Eu gostaria de fazer uma interface diferente, configuração.Algo assim.

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

Então, feito isso, você poderia realmente trabalhar assim.

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

Esta é apenas uma maneira de fazer isso, eu gosto dessa maneira, pois você pode facilmente criar uma classe de fábrica em torno disso que ajuda a declarar as instâncias conforme necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top