0

我有一个计算图像大小的基类。我从中派生了一个类,并具有将在我的代码中使用的预定义图像大小。虽然我的工作有效,但我有一种强烈的感觉,就是我做得不好。

理想情况下,我只想将 DerviedClass.PreviewSize 作为参数传递给 GetWidth,而不必创建它的实例。

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

2 回答 2

7

在我看来,您想要一个更灵活的实现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这将重用您调用它时的相同实例。

于 2009-04-05T06:32:54.157 回答
3

有几种方法可以做到这一点,具体取决于您的需要。我会考虑做一个不同的界面,设置。像这样的东西。

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);

这只是一种方法,我喜欢这种方法,因为您可以轻松地围绕它创建一个工厂类,帮助您根据需要声明实例。

于 2009-04-05T06:27:26.900 回答