Сохранять поведение по умолчанию, определенное абстрактно, используя другой тип в производном классе - PullRequest
0 голосов
/ 26 августа 2018

Используя контекст Models и View Models из MVVM, как мне справиться с этой ситуацией?

У меня есть два абстрактных класса, которые будут основой всех моделей и моделей представлений вмоя программа;BaseModel и BaseViewModel.

Они выглядят следующим образом.


public abstract class BaseModel {
    public string Name { get; set; }
}

public abstract class BaseViewModel {
    protected readonly BaseModel baseModel;

    public BaseViewModel(BaseModel baseModel) {
        this.baseModel = baseModel;
    }

    public string Name {
        get => baseModel.Name;
        set {
            baseModel.Name = value;
        }
    }
}

У меня также есть эти два класса, которые будутиспользуется с определенным видом в моей программе;UseableModel и UseableViewModel.

Они выглядят следующим образом.


public class UseableModel : BaseModel {
    public string NewVar { get; set; }
}

public class UseableViewModel : BaseViewModel {
    public UseableViewModel(UseableModel model) : base(model) { }

    public string NewVar {
        get => baseModel.NewVar;
        set {
            baseModel.NewVar = value;
        }
    }
}

Проблема в том, что это, очевидно, не будет работатьпоскольку UseableViewModel.NewVar пытается сделать ссылку на свойство, которое не существует в BaseModel.

Каков наилучший способ разрешить каждой модели представления сохранять поведение, определенное в BaseViewModel, но использоватьего собственная модель, расширенная с BaseModel?


Потенциальные решения

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

Вы также можете определить отдельную модель в модели представления, например

//...
private readonly UseableModel model;

public UseableViewModel(UseableModel model) : base(model)
{
    this.model = model
}
//...

Но естьПроблема дублирования наборов данных и траты пространства, а также наличия противоречивых данных между двумя моделями.

Так есть ли способ избежать дублирования определений методов и избежать проблемы, описанной непосредственно выше?

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете заставить BaseModel и BaseViewModel реализовывать дженерики.Что-то вроде:

public abstract class BaseModel<TModel>
{
    public string Name { get; set; }
}

public abstract class BaseViewModel<TModel> where TModel : BaseModel<TModel>
{
    protected readonly TModel baseModel;

    public BaseViewModel(TModel baseModel)
    {
        this.baseModel = baseModel;
    }

    public string Name
    {
        get => baseModel.Name;
        set => baseModel.Name = value;
    }
}

public class UseableModel : BaseModel<UseableModel>
{
    public string NewVar { get; set; }
}

public class UseableViewModel : BaseViewModel<UseableModel>
{
    public UseableViewModel(UseableModel model) : base(model) { }

    public string NewVar
    {
        get => baseModel.NewVar;
        set => baseModel.NewVar = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...