C#继承视图和演示者

时间:2009-11-05 22:38:26

标签: c# asp.net inheritance interface mvp

我正在使用ASP.NET中的MVP,并希望了解是否有更简单/更清晰的方法来执行此操作。

我有一个有视图的演示者。事实证明,我可以在同一应用程序区域中的其他视图/演示者中重用一些视图属性和演示者方法。

假设我有一个Bar,这在逻辑上是一个Foo。基本主持人FooPresenter对Bar及其兄弟姐妹有着共同的逻辑。 IFoo视图也有共同的属性。

我希望能够将视图视为FooPresenter中的IFooView,并将视图视为BarPresenter中的IBarView并使其成为相同的实例,因此我在视图实现中得到了所有Foo的东西,aspx页。

这就是我所拥有的:

public interface IFooView {
    // foo stuff
}

public interface IBarView : IFooView {
    // bar stuff
}

public abstract class FooPresenter<T> where T : IFooView {
    public FooPresenter(T view) {
        this.view = view;
    }

    private IFooView view;
    public T View 
    {
        get { return (T)view; }
    }

    public void SomeCommonFooStuff() { }
}

public class BarPresenter : FooPresenter<IBarView> {
    public BarPresenter (IBarView view) 
        : base(view) {

    }

    public void LoadSomeBarStuff() {
        View.Stuff = SomeServiceCall();
    }
}    

有趣的部分是通过执行转换的基类中的属性访问子类中的视图接口。有关于此的任何想法,或有关如何使这更容易维护的建议吗?

3 个答案:

答案 0 :(得分:1)

我唯一可以看到的是我要改变的是删除FooPresenter中的私有字段,并坚持使用公共getter和私有setter的属性。

在这种情况下不需要私有字段,只需让泛型为您完成工作。

答案 1 :(得分:0)

我做了类似的事情,在BarPresenter中,我有一个公共的IBarView View {get {return(IBarView)this.view; }。然后你可以参考大写视图并得到你需要的东西。

答案 2 :(得分:0)

私有字段视图可以声明为类型T,这样可以避免不必要的强制转换

    private T view;