C#: Пропустите производственный класс как параметр
-
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);
Это всего лишь один из способов сделать это, мне это нравится, так как вы можете легко создать фабричный класс вокруг этого, который поможет вам объявить экземпляры по мере необходимости.