Search code examples
classpropertiesstaticvirtual

Sense of making virtual properties and static Create() method


I have some examples of DevExpress demo. There are two models and one ViewModel. Class are used by SchedulerControl. Can you explain me, why in the model classes are used virtual properties and static Create() methods, also why in ViewModel collections are virtual.

There is ViewModel:

public class MainViewModel
{
    public virtual ObservableCollection<Schedule> Schedules { get; set; }
    public virtual ObservableCollection<Program> Programs { get; set; }

    protected MainViewModel()
    {
        CreateSchedules();
        CreatePrograms();
    }
    private void CreateSchedules()
    {
        Schedules = new ObservableCollection<Schedule>();
        Schedules.Add(Schedule.Create(Id: 1, Name: "Schedule 1"));
        Schedules.Add(Schedule.Create(Id: 2, Name: "Schedule 2"));
        Schedules.Add(Schedule.Create(Id: 3, Name: "Schedule 3"));
    }
    private void CreatePrograms()
    {
        Programs = new ObservableCollection<Program>();
        Programs.Add(Program.Create(
            startTime: DateTime.Now.Date.AddHours(10), endTime: DateTime.Now.Date.AddHours(11),
            scheduleId: 1, name: "Program 1"));
    }
}

Schedule.cs

public class Schedule
{
    public static Schedule Create()
    {
        return ViewModelSource.Create(() => new Schedule());
    }
    public static Schedule Create(int Id, string Name)
    {
        Schedule schedule = Create();
        schedule.Id = Id;
        schedule.Name = Name;
        return schedule;
    }

    protected Schedule() { }

    public virtual int Id { get; set; }
    public virtual string Name { get; set; }

}    

Program.cs:

public class Program
{
    public static Program Create()
    {
        return ViewModelSource.Create(() => new Program());
    }
    internal static Program Create(DateTime startTime, DateTime endTime,
        int scheduleId, string name)
    {

        Program program = Create();
        program.StartTime = startTime;
        program.EndTime = endTime;
        program.ScheduleId = scheduleId;  
        return apt;
    }

    protected Program() { }

    public virtual int Id { get; set; }
    public virtual bool AllDay { get; set; }
    public virtual DateTime StartTime { get; set; }
    public virtual DateTime EndTime { get; set; }
    public virtual int? ScheduleId { get; set; }
}

Solution

  • Virtual properties / collections allow to modify their usage in derived classes e.g. set them according to your wishes for tests (by hand or by some library). They can be also required by ORM (np. nHibernate) for proper manipulation of data and database usage.

    Static Create() methods are part of factory pattern. More about it you can read under this question.