為了減少相同程式碼出現的頻率,所以改用繼承的方式
A專案
namespace A.Models { public class Field { public Guid FieldId { get; set; } public DateTime CreateOn { get; set; } public Guid Creater { get; set; } public DateTime UpdateOn { get; set; } public Guid Updater { get; set; } public ICollectionLanguage { get; set; } } public class FieldLanguage { public Guid FieldLanguageId { get; set; } public string Aliases { get; set; } public string Notes { get; set; } public string Language { get; set; } public Field Field { get; set; } } }
B專案(參考A專案)
namespace B.Models { public class Field : A.Models.Field { //放置View所需語系資料 public string Language_Aliases { get; set; } public string Language_Notes { get; set; } } }
當需要把FieldLanguage放到變數中做處理時,就會發生"找不到類型或命名空間名稱'FieldLanguage'"的錯誤
B的Model追加FieldLanguage,因為欄位相同,所以一樣繼承A的FieldLanguage
public class FieldLanguage : A.Models.FieldLanguage { }
雖然解決了找不到類別的問題,但是也多了"類型'A.Models.FieldLanguage'不能隱含轉換為'B.Models.FieldLanguage'"的錯誤
原來繼承裡面所關聯的類別是原本所指定的,不會因為繼承的專案有相同類型名稱而轉換過去,所以繼承後要再把關聯加回去
public ICollectionFieldLanguage { get; set; }
這邊會有一個警告,"'B.Models.FieldLanguage'隱藏了繼承的成員'A.Models.FieldLanguage'。如果是刻意要隱藏,請使用new關鍵字"
因為名稱是一樣的,所以編譯器會自動把父類別的屬性或方法隱藏掉
PS:範例是用屬性,所以用new的方式,如果是方法,請盡量使用override(可參考new和override的差異與目的)
public new ICollectionFieldLanguage { get; set; }
FieldLanguage當然也要參考回Field
public new Field Field { get; set; }
最後B的類別如下:
namespace B.Models { public class Field : A.Models.Field { public string Language_Aliases { get; set; } public string Language_Notes { get; set; } public new ICollection以上就可以完成多專案的部分類別,各專案本身當然也是可以繼續使用部分類別(partial)FieldLanguage { get; set; } } public class FieldLanguage : A.Models.FieldLanguage { public new Field Field { get; set; } } }
問:為什麼要加回關聯?
答:因為在Model只要做一次,後面資料處理就可以很輕鬆,當然不加也是可以,只是資料處理還要做型態轉換,如果這個Model很多地方會使用,那光型態轉換就有得忙了
參考:
new和override的差異與目的
區分 abstract、virtual、override 和 new
沒有留言 :
張貼留言