2010-04-02 66 views
4
public interface IBasePresenter 
{ 
} 
public interface IJobViewPresenter : IBasePresenter 
{ 
} 
public interface IActivityViewPresenter : IBasePresenter 
{ 
} 

public class BaseView 
{ 
    public IBasePresenter Presenter 
    { 
     get; 
     set; 
    } 
} 

public class JobView : BaseView 
{ 
    public IJobViewPresenter JobViewPresenter 
    { 
     get { this.Presenter as IJobViewPresenter;} 
    } 
} 

public class ActivityView : BaseView 
{ 
    public IActivityViewPresenter ActivityViewPresenter 
    { 
     get { this.Presenter as IActivityViewPresenter;} 
    } 
} 

讓我們假設,我需要對基本視點一個IBasePresenter屬性。 現在,這個屬性是由工作視圖和ActivityView繼承,但如果我需要參考IJobViewPresenter對象在這些派生類然後我需要在投IBasePresenter財產IJobViewPresenter或IActivityPresenter(我想避免),或在派生類創建JobViewPresenter和ActivityViewPresenter(如上所示)。設計以避免派生類中的類型轉換?

我想避免在派生類的類型轉換,仍然有參考IJobViewPresenter或IActivityViewPresenter,仍然有IBasePresenter的基本視角。

有沒有一種方法可以讓我實現嗎?

回答

5

你可以這樣做:

public class BaseView<TPresenter> 
     where TPresenter: IBasePresenter 
    { 
     TPresenter Presenter { get; set; } 
    } 

    public class JobView: BaseView<IJobViewPresenter> 
    { 

    } 

如果您有需要引用基本視點代碼,你可以創建一個接口,並露出基底主持人是這樣的:

public interface IBaseView 
    { 
     IBasePresenter BasePresenter { get; } 
    } 

    public class BaseView<TPresenter> : IBaseView 
     where TPresenter: IBasePresenter 
    { 
     TPresenter Presenter { get; set; } 

     IBasePresenter IBaseView.BasePresenter 
     { 
      get { return Presenter; } 
     } 
    } 

類需要訪問BaseView的應用程序現在可以直接使用接口而不是BaseView。您也可以公開其他需要使用的基礎服務。

+0

你可以,但沒有必要,因爲接口彼此繼承。 – 2010-04-02 17:06:24

+0

@Steven,你能澄清你的意思嗎?我相信這個問題是如何暴露在它的派生形式的接口,因此,它是明確清晰的演示者的工作視圖始終是一個IJobViewPresenter(並假設正確使用會始終保持它的IJobViewPresenter下不僅鑄造。) – 2010-04-02 17:17:44

+0

好的解決方案...我喜歡它...... THanks – Deepak 2010-04-02 17:20:28

0

這是多態性的工作。

public interface IBasePresenter 
{ 
} 
public interface IJobViewPresenter : IBasePresenter 
{ 
} 
public interface IActivityViewPresenter : IBasePresenter 
{ 
} 

public class BaseView : IBasePresenter 
{ 
} 

public class JobView : BaseView, IJobViewPresenter 
{ 
} 

public class ActivityView : BaseView, IActivityViewPresenter 
{ 
} 
+0

這假定視圖實現了視圖展示器,而原始視圖具有包含視圖展示器的視圖。 – 2010-04-02 17:11:18

+0

@丹:我想重點是我反對的約束。我不認爲子類應該返回子接口。它幾乎消除了擁有繼承結構的任何一點。 – 2010-04-02 17:32:01