Design to avoid casting types in derived classes?

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;} } } 

Suppose I need the IBasePresenter property in BaseView. Now this property is inherited by JobView and ActivityView, but if I need a reference to the IJobViewPresenter object in these derived classes, then I need to enter the cast IBasePresenter property in IJobViewPresenter or IActivityPresenter (which I want to avoid) or create JobViewPresenter and ActivityViewPresenter on the derived classes (as shown above )

I want to avoid type casting in derived classes and still have a link to IJobViewPresenter or IActivityViewPresenter and still have an IBasePresenter in BaseView.

Is there any way I can achieve this?

+4
source share
2 answers

You can do it:

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

If you have code that should reference BaseView, you can create an interface and open the base presenter as follows:

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

Classes that need access to BaseView can now use the interface instead of BaseView directly. You can also identify any other basic services that should also be consumed.

+5
source

This is a quest for polymorphism.

 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
source

Source: https://habr.com/ru/post/1305863/


All Articles