2011-01-26 43 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。