0

我创建了以下类,它描述了用户可能上传的任何类型的文件:

namespace MyModels.Models
{
    public class File
    {
        public string FileName { get; set; }
        public string FileTypeId { get; set; }
        public string URLFileName { get; set; } //cleaned for web
        public string Dir { get; set; } //which directory is located in
        public long FileSize { get; set; } //size in bytes
        public DateTime DateAdded { get; set; } //date uploaded
        public int UploadedByUser {get; set;} //UserID of user
        public bool inCloud { get; set; } // moved to cloud
        public bool inGlacier { get; set; } // moved to glaciers
        public DateTime? DateTrashed { get; set; } //date user deleted
        public int TrashedByUser { get; set; } //UserID of user
        public List<FileDescendent> Descendents { get; set; } //List of copies
    }
}

然后我想为图像文件创建一个类。我希望这个类也有文件属性。我这样做吗?

namespace MyModels.Models
{
    public class Image : File
    {
        public int OrigHeight { get; set; }
        public int OrigWidth { get; set; }
    }
}

或这个?

namespace MyModels.Models
{
    public class Image
    {
        public int OrigHeight { get; set; }
        public int OrigWidth { get; set; }
        public File File { get; set; }
    }
}

请问有什么区别?

谢谢!

4

4 回答 4

1

这是一种传承。在这种情况下,图像是一个文件。

public class Image : File
{
    public int OrigHeight { get; set; }
    public int OrigWidth { get; set; }
}

这是一篇作文。在这种情况下,图像有一个文件。

public class Image
{
    public int OrigHeight { get; set; }
    public int OrigWidth { get; set; }
    public File File { get; set; }
}

至于我,图像是一个文件。因此继承在这里更合适。

于 2012-10-16T23:11:56.177 回答
0

我认为区别在于API。您宁愿将 inCloud 查找为image.inCloudimage.File.inCloud吗?

在大多数情况下,我更喜欢image.inCloud. 但是,例如,如果 File 实例化成本很高,则可能首选第二种访问器模式。

于 2012-10-16T23:00:57.777 回答
0

你的第一个例子是继承,第二个例子不是。

在您的第二个示例中,您还将拥有文件属性,但捆绑在File属性中。FileName例如,要访问该属性,您将使用obj.File.FileName而不是obj.FileName继承类时获得的属性。

此外,作为类File中的属性Image,它不会在您创建Image类的实例时自动创建。您还必须创建File类的实例并放入实例的File属性Image

于 2012-10-16T23:01:12.833 回答
0

我会选择继承。它将允许您对两者都使用依赖注入模型。对 MVC3 非常有用的东西。

第二大优势是您可以拥有显示文件列表的共享视图,并且您可以传入这两种类型的集合。更不用说你写的任何 Linq 了。

于 2012-10-16T23:05:02.480 回答