2010-04-02 2 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 в BaseView. Теперь это свойство наследуется JobView и ActivityView, но если мне нужна ссылка на объект IJobViewPresenter в этих производных классах, тогда мне нужно ввести свойство cast IBasePresenter для IJobViewPresenter или IActivityPresenter (чего я хочу избежать) или создать JobViewPresenter и ActivityViewPresenter на производных классах (как показано выше).Дизайн, чтобы избежать литья типов в производных классах?

Я хочу избежать литья типов в производных классах и по-прежнему иметь ссылку на IJobViewPresenter или IActivityViewPresenter и все еще иметь IBasePresenter в BaseView.

Есть ли способ, которым я могу это достичь?

ответ

5

Вы можете сделать это:

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

    public class JobView: BaseView<IJobViewPresenter> 
    { 

    } 

Если у вас есть код, который должен ссылаться BaseView, вы можете создать интерфейс и выставить базовый ведущий вроде этого:

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

Вы можете, но нет необходимости, поскольку интерфейсы наследуются друг от друга. –

+0

@Steven, Не могли бы вы пояснить, что вы подразумеваете под этим? Я считаю, что вопрос заключался в том, как разоблачить интерфейс в его производной форме, так что явно ясно, что Presenter для JobView всегда является IJobViewPresenter (и не просто литой в предположении, что правильное использование всегда будет поддерживать его в IJobViewPresenter.) –

+0

Хорошее решение ... Мне это нравится .. Thanks – Deepak

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

Это предполагает, что представления реализуют презентатор представления, тогда как исходный столбец имеет представления, содержащие представления докладчиков. –

+0

@ Dan: Я думаю, дело в том, что я возражаю против ограничений. Я не думаю, что дочерние классы должны возвращать дочерние интерфейсы. Это в значительной степени устраняет любую точку с наличием структуры наследования. –

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