C#: Пропустите производственный класс как параметр

StackOverflow https://stackoverflow.com/questions/718443

  •  23-08-2019
  •  | 
  •  

Вопрос

У меня есть базовый класс, который выполняет расчеты по размерам изображений. Я получаю класс из этого и имею предопределенные размеры изображений, которые будут использоваться в моем коде. Пока то, что у меня есть, у меня есть сильное чувство, что я не делаю это должным образом.

В идеале я хотел бы просто передать derviedclass.previewsize в качестве параметра, чтобы получить прогибу без необходимости создавать его экземпляр.

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; } }
    }
}
Это было полезно?

Решение

Мне кажется, что вы хотите более гибкую реализацию ISize - Имея реализацию, которая всегда Возвращает ту же ценность, кажется довольно бессмысленным. С другой стороны, я вижу, что вам нужен простой способ получить размер, который вы всегда используете для предварительного просмотра. Я бы сделал это так:

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

Затем вы можете написать:

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

d.Save(userId, FixedSize.Preview);

Это повторно использует тот же экземпляр FixedSize Всякий раз, когда ты это называл.

Другие советы

Есть несколько способов, которыми вы могли бы сделать это, в зависимости от ваших потребностей. Я бы посмотрел на другой интерфейс, настройку. Что-то вроде этого.

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

Затем, с этим, вы могли бы действительно работать с этим так.

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

Это всего лишь один из способов сделать это, мне это нравится, так как вы можете легко создать фабричный класс вокруг этого, который поможет вам объявить экземпляры по мере необходимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top