Пропогатировать значение свойства в классе иерархии - PullRequest
1 голос
/ 27 января 2011

Я хочу распространить свойство от дочернего класса к родительскому классу, То есть: если MySchool.ModifiedTime изменено, оно также должно изменить ModifiedTime в классе ученика, как мудрое LstBook [0]. 1006 * а также 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;}
}

Ответы [ 5 ]

3 голосов
/ 27 января 2011

Вы можете сделать 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

2 голосов
/ 27 января 2011

Похоже, вы неправильно понимаете, как работает иерархия объектов.

Реализация этого как члена класса только связывает его с созданным объектом, и статический метод, конечно, будет означать, что все объекты получают доступ к одному и тому же свойству.

Вместо этого, насколько я понимаю, вы хотите, чтобы группы экземпляров (не все) совместно использовали свойство.

Самый простой способ сделать это - создать общий объект, который предоставляет измененное время для всех экземпляров в группе.

1 голос
/ 27 января 2011

Как отмечали другие комментаторы, вы не можете сделать это простым способом с базовым классом просто потому, что это не так, как работает иерархия классов.Что вы можете сделать, это создать другой класс с именем «GroupInfo» или что-то в этом роде.Сделайте ModifiedTime свойством для этого.

Во всех других ваших классах добавьте свойство для GroupInfo.Затем всякий раз, когда вы создаете новую книгу или что-то еще, как часть конструктора передайте ссылку на GroupInfo для книги.

Таким образом, все объекты в группе будут совместно использовать один GroupInfo, и, следовательно, одинModifiedTime.

0 голосов
/ 27 января 2011

Обновление: Более полный пример;лучшее объяснение методологии

Ваш базовый класс может быть лучше описан как интерфейс, поскольку вы обязываете каждый класс реализовывать общее свойство, а не делать общие вычисления или широкие обобщения, которые могут группировать школы, учащихсяи книги вместе.

Для решения, основанного на событиях, есть несколько вещей, которые вы можете сделать, например, использовать 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; }
}
0 голосов
/ 27 января 2011

Вы можете сделать ModifiedTime статическим, что сделает его доступным для всех производных экземпляров MyBaseClass.

public class MyBaseClass
{
  public static DateTime ModifiedTime{ get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...