Domanda

Ho una classe di base che fa i calcoli su dimensioni delle immagini. Sto derivante da una classe che ho e predefiniti dimensioni delle immagini che verranno utilizzate nel mio codice. Mentre quello che io ho le opere, ho la forte sensazione che io non sto facendo in modo corretto.

Idealmente, vorrei passare proprio DerviedClass.PreviewSize come parametro per GetWidth senza dover creare un'istanza di esso.

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; } }
    }
}
È stato utile?

Soluzione

Mi sembra che si desidera un'attuazione più flessibile dei ISize - avere un'implementazione che sempre restituisce lo stesso valore sembra abbastanza inutile. D'altra parte, vedo che si desidera un modo semplice di ottenere la dimensione di utilizzare sempre per l'anteprima. Vorrei fare in questo modo:

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

È quindi possibile scrivere:

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

d.Save(userId, FixedSize.Preview);

Ciò riutilizzare la stessa istanza di FixedSize ogni volta che ha chiamato.

Altri suggerimenti

Ci sono alcuni modi che si potrebbe fare questo, a seconda delle esigenze. Vorrei guardare a fare una diversa interfaccia, l'installazione. Qualcosa di simile a questo.

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

Poi, con questo fatto, si potrebbe effettivamente lavorare con essa in questo modo.

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

Questo è solo uno dei modi per farlo, mi piace questo modo, come si può facilmente creare una classe factory intorno a questo che aiuta a dichiarare le istanze in base alle esigenze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top