如何使用MVP模式来处理不同的接口实现?

问题描述 投票:1回答:1

我有我的工作,并希望能在一个应如何处理使用MVP模式接口的多种实现清晰的设计。这里是我的情况:

有一个基地“坦克”的接口定义的坦克应该做的基本功能。

public interface ITankView
{
  public string TankName
  public double TankLevel
  public double TankSize
  ... ext ...
}

我的演示者接受该接口的实现(即 - 的“罐”视图):

public class TankPresenter
{
  ITankView tank;
  public void TankPresenter(ITankView tank)
  {
    this.tank = tank;
  }

  public void DoStuffWithaBasicTank()
  {
     tank.TankName = "This is a basic Tank!"
     tank.TankSize = 100;
     tank.TankLevel = 50;
  }
}

我也有ITankView接口的多种实现:

// Just a basic tank with a level:
public class BasicTankView, ITankView
{
   public string TankName {get; set;}
   public double TankLevel {get; set;}
   public double TankSize {get; set;}
}

// The "Advanced" version of a tank:
public class MixableTankView, ITankView
{
   public double TankName {get; set;}
   public double TankLevel {get; set;}
   public double TankSize {get; set;}
   public double MixingSpeed {get; set;}
}

所以我的问题是,我该如何处理“高级”,在坦克演示混合ThankView同时,秉承MVP图案和最佳实践?

例如,如果我发起与MixingTankView的TankPresenter你将如何访问特别的“高级”功能?

public MixingTankView view = new MixingTankView();
public TankPresenter Presenter = new TankPresenter(view );


public class TankPresenter
{
  ITankView tank;
  public void TankPresenter(ITankView tank)
  {
    this.tank = tank;
  }

  public void DoStuffWithaMixingTank()
  {
     tank.TankName = "This is a mixing Tank!"
     tank.TankSize = 100;
     tank.TankLevel = 50;
     tank.MixingSpeed = 75; // This does not work as it's not declared in ITankView!!
  } 
}

我想我需要在每个演讲者和所有类型坦克的补充。因此,在这个例子中,这将是一个IBasicTankPresenter和IMixingTankPresenter但我仍然对如何将工作有点困惑。也90%的两个槽之间的功能是相同的,从而它似乎是多余的。在现实中,我已经不仅仅是2坦克越来越实际执行要复杂得多,但每罐型只有细微的差别。

我的目标是:

  1. 为了降低代码复杂度和代码耦合/帧间Dependance的
  2. 坚持MVP模式在一定程度上
  3. 不重复自己一堆次,每次坦克类型。 我想减少代码量为我自己的理智 我真的需要1个演讲者每1罐看法?
c# interface mvp solid-principles presenter
1个回答
2
投票

首先,你需要添加一个接口,为MixableTankView -

public interface IMixableTankView : ITankView
{
    double MixingSpeed {get;set;}
}

然后,你可以简单地使用泛型。你开始你的基本演示,只是现在你改变ITankView的类型参数:

public class TankPresenter<TTankView> where TTankView : ITankView
{
    TTankView tank;
    // basic implementation here
}

并添加其他演示继承它:

public class MixingTankPresenter : TankPresenter<IMixableTankView>
{
    // IMixableTankView special implementation here
}

你为每个不同的实施ITankView的做到这一点 - 这样一来,大部分的代码仍然将只有在基本TankPresenter,你会得到保持MVP原则,整个项目。


推荐问答