2016-12-05 28 views
1

私は複数の継承を持っています。私がしようとしていることをよりよく理解するために、例のコメントを見てください。継承 - ターゲット固有の継承クラス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 
    } 
} 

それは常にBaseViewModelFor<>から継承されたクラスを指していますので、だから私は知りたいのですが、何が(this as CompanyEventsView)ビットを強制する方法ですか?

答えて

1

残念ながら、基本クラスはそれから継承したクラスを知ることができません。 1つのオプションは、これはComponentsEventViewの実装はこのためにできるようになります仮定に基づいている

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

ComponentsEventViewコンストラクタで、その後ベースのコンストラクタとMapFromSourceObjectを呼び出すことです。

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(オブジェクトソース)は、空のボディを持っているでしょうし、全体的なアイデアつもりかつてから継承されたビューとベースモデルクラスをマッピングすることの汎用機能を持っていることでしたBaseViewModelの場合。 –