MVC C3继承类的正确格式是什么?

时间:2012-10-16 22:55:30

标签: c# oop

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

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 个答案:

答案 0 :(得分:1)

这是inheritance。在这种情况下,图片文件。

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

这是composition。在这种情况下,图片有一个文件。

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

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

答案 1 :(得分:0)

我认为差异在于API。您希望在image.inCloudimage.File.inCloud中查找云计算吗?

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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