Frage

Ich habe eine Basisklasse, die Berechnungen auf Bildgrößen durchführt. Ich stelle eine Klasse daraus ab und habe vordefinierte Bildgrößen, die in meinem Code verwendet werden. Während das, was ich habe, funktioniert, habe ich das starke Gefühl, dass ich es nicht richtig mache.

Im Idealfall möchte ich nur DerviedClass.PreviewSize als Parameter für die Getbreite übergeben, ohne eine Instanz davon erstellen zu müssen.

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; } }
    }
}
War es hilfreich?

Lösung

Es scheint mir, dass Sie eine flexiblere Implementierung von wollen ISize - mit einer Implementierung mit stets Rückgabe der gleiche Wert scheint ziemlich sinnlos. Auf der anderen Seite kann ich sehen, dass Sie eine einfache Möglichkeit haben möchten, die Größe zu erhalten, die Sie immer für eine Vorschau verwenden. Ich würde es so machen:

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

Sie könnten dann schreiben:

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

d.Save(userId, FixedSize.Preview);

Dies würde die gleiche Instanz wiederverwenden FixedSize Wann immer du es angerufen hast.

Andere Tipps

Es gibt einige Möglichkeiten, wie Sie dies tun können, abhängig von Ihren Bedürfnissen. Ich würde mir eine andere Schnittstelle und Setup ansehen. Etwas wie das.

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

Dann könnten Sie damit tatsächlich so arbeiten.

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

Dies ist nur eine Möglichkeit, es zu tun, ich mag diese Weise, da Sie leicht eine Fabrikklasse um diese erstellen können, die Ihnen hilft, die Instanzen nach Bedarf zu erklären.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top