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.inCloudまたはとして検索しますかimage.File.inCloud

ほとんどの場合、私は好むでしょうimage.inCloud。ただし、たとえば、ファイルのインスタンス化にコストがかかる場合は、2番目のアクセサーパターンが優先される場合があります。

于 2012-10-16T23:00:57.777 に答える
0

最初の例は継承ですが、2番目の例は継承ではありません。

2番目の例では、ファイルプロパティもありますが、Fileプロパティにバンドルされています。FileNameたとえば、プロパティにアクセスするには、クラスを継承するときに取得するのではobj.File.FileNameなく、を使用します。obj.FileName

また、クラスFileのプロパティと同様に、Imageクラスのインスタンスを作成するときに自動的に作成されることはありませんImageFileまた、クラスのインスタンスを作成し、インスタンスのFileプロパティに配置する必要がありImageます。

于 2012-10-16T23:01:12.833 に答える
0

私は継承で行きます。両方に依存性注入モデルを使用できるようになります。MVC3 で非常に便利なもの。

2 番目の大きな利点は、ファイルのリストを表示する共有ビューを持つことができ、両方のタイプのコレクションを渡すことができることです。Linq あなたの書き込みは言うまでもありません。

于 2012-10-16T23:05:02.480 に答える