【问题标题】:C# inheritance with views and presenters带有视图和演示者的 C# 继承
【发布时间】:2010-12-13 15:19:33
【问题描述】:

我正在使用 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();
    }
}    

有趣的部分是通过执行转换的基类中的属性访问子类中的视图界面。对此有什么想法,或者关于我如何能够使其更易于维护的建议?

【问题讨论】:

    标签: c# asp.net inheritance interface mvp


    【解决方案1】:

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

        private T view;
    

    【讨论】:

    • 确实,这是唯一需要解决的问题
    【解决方案2】:

    我能看到的唯一要更改的是删除 FooPresenter 中的私有字段,并仅使用具有公共 getter 和私有 setter 的属性。

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

    【讨论】:

      【解决方案3】:

      我在 BarPresenter 中做了类似的事情,我有一个 public IBarView View { get { return (IBarView)this.view; } }。然后你就可以参考资本视图,得到你所需要的。

      【讨论】:

      • 我过去也这样做过,但认为在基类中进行强制转换可能更干净。我有时会尝试在孩子中使用成员而不是属性,但后来意识到它没有转换为正确的类型。
      • 您不能在基类中对 IBarView 进行强制转换,因为 IFooView 不应该知道子类。如果你使用基类视图,而不是 View(即使是错误的),如果你不需要 IBarView 属性,它仍然有效,但如果你这样做,那么它就不会编译。
      • 基类知道 T 是它所需要的,并且上面编译得很好。但感谢您的意见。
      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多