2011-01-26 41 views
1

我想從子類屬性傳播到父類, 即:如果MySchool.ModifiedTime發生變化,也應在學生班級改變ModifiedTime太像明智LstBook [0] .ModifiedTime改變應該改變MySchool.ModifiedTime以及Student.ModifiedTime ...(基本ModifiedTime應該是同步的),任何想法傳播完成屬性值

我正在尋找在BaseClass的通用功能的實現這個。

public class MyBaseClass 
{ 
    public DateTime ModifiedTime{ get; set; } 
} 

public class Student: MyBaseClass 
    {  
public string Name { get; set; } 
public school MySchool {get;set;} 
} 

public class School : MyBaseClass 
{ 
public string SchoolName { get; set; } 
public List<Book> LstBook {get;set;} 
} 

public class Book:MyBaseClass 
{ 
    public string BookName{get;set;} 
} 
+0

如果我理解正確的問題,你有幾個不同的對象,但你希望他們都共享一個ModifiedTime。也就是說,如果某人更改了學校對象的ModifiedTime,則您希望關聯的Student's ModifiedTime也發生變化。是對的嗎? – Tridus 2011-01-27 00:31:09

+0

是的,在同一個班級結構 – kayak 2011-01-27 01:02:12

回答

3

你可以做ModifiedTime虛擬然後在每個子類中重寫它來進行同步。

public class MyBaseClass 
{ 
    public virtual DateTime ModifiedTime{ get; set; } 
} 

public class Student: MyBaseClass 
{  
    public string Name { get; set; } 
    public school MySchool {get;set;} 
    public virtual DateTime ModifiedTime 
    { 
    get { 
     return MySchool.ModifiedTime; 
    } 
    set { 
     MySchool.ModifiedTime = value; 
    } 
    } 
} 

依此類推。

但是,我會重新考慮您的類層次結構,因爲它看起來像因子是不正確的。如果所有屬性需要在整個層次結構中同步,那麼可能只有一個類應該具有該屬性,其他類應該引用該屬性。例如,只有School應該有ModifiedTime屬性,當你需要獲得一個學生修改的時候,你會找回它通過MySchool財產

+0

中它可以工作,但我不想在每個實現的類(如學生,學校,書籍)中編寫此代碼。我正在尋找BaseClass中的通用函數來實現此目的。 – kayak 2011-01-26 23:46:37

+0

這些是示例類,但在實際場景中Book類可以用在Teacher類中,所以我不想嵌套它。 – kayak 2011-01-26 23:50:49

0

您可以ModifiedTime靜態的,這將導致它在所有導出共享MyBaseClass的實例。

public class MyBaseClass 
{ 
    public static DateTime ModifiedTime{ get; set; } 
} 
0

更新:更完整的例子;方法的更好的解釋

你的基類,可以更好地描述爲,因爲你強制每個類實現一個共同的財產,而不是使常見的計算或一概而論,可以組學校,學生,和書籍一起接口。

追求事件驅動的解決方案,有幾件事你可以做,如使用BindingList<T>,這基本上是類固醇List<T>

不幸的是,你需要將你的漂亮的小{ get; set; }屬性分解爲完整的字段,但最好的方法是每次修改屬性觸發一個事件。隨後的每個受修改影響的對象都將訂閱您的修改對象Modified事件。

public interface IChangeAware 
{ 
    event EventHandler<EventArgs> OnChange; 
    DateTime ModifiedTime { get; set; } 
} 

public class Student : IChangeAware 
{ 
    public event EventHandler<EventArgs> OnChange; 
    public DateTime ModifiedTime { get; set; } 

    public string Name { get; set; } 
    public School School 
    { 
     get { return School; } 
     set 
     { 
      School = value; 
      if (this.OnChange != null) 
       this.OnChange(this, new EventArgs()); 
     } 
    } 

    public Student() 
    { 
     if (School != null) 
      School.OnChange += MySchoolOnChange; 
    } 

    void MySchoolOnChange(object sender, EventArgs e) 
    { 
     ModifiedTime = DateTime.Now; 
    } 
} 

public class School : IChangeAware 
{ 
    public event EventHandler<EventArgs> OnChange; 
    public DateTime ModifiedTime { get; set; } 

    public string SchoolName { get; set; } 
    public BindingList<Book> Books { get; set; } 

    public School() 
    { 
     Books = new BindingList<Book>(); 
     Books.ListChanged += BooksListChanged; 
    } 

    void BooksListChanged(object sender, ListChangedEventArgs e) 
    { 
     ModifiedTime = DateTime.Now; 
     OnChange(this, new EventArgs()); 
    } 
} 

public class Book 
{ 
    public string BookName { get; set; } 
} 
2

您似乎誤解了對象層次結構的工作原理。

將其作爲類成員實現只會將其鏈接到創建的對象,而靜態方法當然意味着所有對象都訪問同一個屬性。

相反,據我所知,你需要實例組(不是全部)共享一個屬性。

最簡單的方法是創建一個共享對象,爲組中的所有實例提供修改時間。

1

正如其他評論者指出的那樣,你不能直接用基類來完成這個任務,因爲這不是類層次結構的工作原理。你可以做的是創建另一個名爲「GroupInfo」或類似的類。使ModifiedTime成爲該屬性。

在所有其他類中,爲GroupInfo添加一個屬性。然後,無論何時創建新書或任何其他內容,都將作爲構造函數的一部分傳遞給本書GroupInfo的引用。

這樣,組中的所有對象將共享一個GroupInfo,並因此共享一個ModifiedTime。