我创建了以下类,它描述了用户可以上传的任何类型的文件:
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; }
}
}
请问有什么不同?
谢谢!
答案 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.inCloud
或image.File.inCloud
中查找云计算吗?
在大多数情况下,我更喜欢image.inCloud
。但是,如果File的实例化成本很高,例如,第二个访问者模式可能是首选。
答案 2 :(得分:0)
你的第一个例子是继承,第二个例子不是。
在第二个示例中,您还将拥有文件属性,但捆绑在File
属性中。例如,要访问FileName
属性,您将使用继承该类时获得的obj.File.FileName
而不是obj.FileName
。
此外,由于File
是Image
类中的属性,因此在创建Image
类的实例时不会自动创建它。您还必须创建File
类的实例并放入File
实例的Image
属性。
答案 3 :(得分:0)
我会继承。它允许您为两者使用依赖注入模型。对MVC3非常有用的东西。
第二大优势是,您可以拥有显示文件列表的共享视图,并且您可以传入两种类型的集合。更不用说你写的任何Linq了。