2016-12-05 4 views
1

У меня есть множественное наследование, посмотрите ниже приведенный ниже комментарий, чтобы лучше понять, что я пытаюсь сделать.Inheritance - целевой определенный унаследованный класс C#

CompanyEventsView : BaseViewModelFor<CompanyEvents> 
{ 
} 

BaseViewModelFor<TSource> : BaseViewModel where TSource : class 
{ 

    public BaseViewModelFor(IAggregator aggregator, IRepository<TSource> repository, int i) 
    { 
     Aggregator = aggregator; 
     var source = repository.GetKey(i); 
     (this as CompanyEventsView).MapFromSourceObject(source); // (this as CompanyEventsView) how could I make this generic so if I inherit another class to point to it 
    } 
} 

Так что я хотел бы знать, как заставить (this as CompanyEventsView) бит, так что это всегда указывает на класс, который наследуется от BaseViewModelFor<>?

ответ

1

К сожалению, базовый класс не может знать, какой класс унаследовал от него. Одним из вариантов является вызов базового конструктора, а затем MapFromSourceObject в конструкторе ComponentsEventView

public ComponentsEventView(...) : base(...) 
{ 
    this.MapFromSourceObject(source) 
} 

Это основано на предположении, что ваша реализация ComponentsEventView позволит для этого.

3

Я бы не использовал общий, но использовал интерфейс. Как указывает другой ответ, базовый класс не может знать, какой класс наследуется от него, поэтому дженерики IMHO не являются решением здесь.

Остерегайтесь того, что вы вызываете производный код класса из конструктора базового класса, что опасно, поскольку производный объект еще не создан полностью.

public interface IFromSourceObjectMapper { 
    void MapFromSourceObject(object source); // TODO: Update parameter type 
} 

BaseViewModelFor<TSource> : BaseViewModel where TSource : class 
{ 

    public BaseViewModelFor(IAggregator aggregator, IRepository<TSource> repository, int i) 
    { 
     Aggregator = aggregator; 
     var source = repository.GetKey(i); 
     var mapper = this as IFromSourceObjectMapper; 
     if (mapper != null) { 
      (this as CompanyEventsView).MapFromSourceObject(source); // (this as CompanyEventsView) how could I make this generic so if I inherit another class to point to it 
     } 
    } 
} 

CompanyEventsView : BaseViewModelFor<CompanyEvents>, IFromSourceObjectMapper 
{ 
    public void MapFromSourceObject(object source) { ... } 
} 
+0

Спасибо за идею, но в этом случае MapFromSourceObject (источник объекта) будет иметь пустое тело, и вся идея состояла в том, чтобы иметь общую функцию, которая собирается быть отображающим представления и базовая модель классов один раз, унаследованных от BaseViewModelFor . –

Смежные вопросы