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

C# 如何使用MVP模式处理不同的接口实现?,c#,interface,mvp,solid-principles,presenter,C#,Interface,Mvp,Solid Principles,Presenter,我有一个正在进行的设计,我想弄清楚如何使用MVP模式处理一个接口的多个实现。以下是我的情况: 有一个基本的“坦克”接口,它定义了坦克应该做什么的基本功能 public interface ITankView { public string TankName public double TankLevel public double TankSize ... ext ... } 我的演示者接受此接口的实现(即“坦克”视图): 我还有多个ITankView接口的实现: // Jus

我有一个正在进行的设计,我想弄清楚如何使用MVP模式处理一个接口的多个实现。以下是我的情况:

有一个基本的“坦克”接口,它定义了坦克应该做什么的基本功能

public interface ITankView
{
  public string TankName
  public double TankLevel
  public double TankSize
  ... ext ...
}
我的演示者接受此接口的实现(即“坦克”视图):

我还有多个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;}
}
所以我的问题是,在坚持MVP模式和最佳实践的同时,如何处理TankPresenter中的“高级”MixingTankView

例如,如果我使用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%的功能是相同的,因此看起来是多余的。事实上,我不止有两个坦克,实际的实现要复杂得多,但每种坦克类型只有细微的差别

我的目标是:

  • 降低代码复杂性和代码的耦合/相互依赖性
  • 在某种程度上坚持MVP模式
  • 不要重复我的话 每种油箱类型都有很多次。
    • 为了我自己的理智,我想减少代码的数量
    • 我真的需要每1个坦克视图有1个演示者吗

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

    public interface IMixableTankView : ITankView
    {
        double MixingSpeed {get;set;}
    }
    
    然后,您可以简单地使用泛型。从基本演示者开始,直到现在才将
    ITankView
    更改为类型参数:

    public class TankPresenter<TTankView> where TTankView : ITankView
    {
        TTankView tank;
        // basic implementation here
    }
    
    公共类TankPresenter,其中TTankView:ITankView
    {
    坦克;
    //这里的基本实现
    }
    
    并添加另一个继承它的演示者:

    public class MixingTankPresenter : TankPresenter<IMixableTankView>
    {
        // IMixableTankView special implementation here
    }
    
    公共类MixingTankPresenter:TankPresenter
    {
    //IMixableTankView在此特殊实现
    }
    

    您可以针对
    ITankView
    的每个不同实现执行此操作-这样,大多数代码仍然只在基本
    TankPresenter
    中,并且您可以在整个项目中保持MVP原则。

    是ITank还是ITankView,你似乎在使用这两个术语,但ITank并没有被定义。ITankView无处不在,这是我的错误。
    public class MixingTankPresenter : TankPresenter<IMixableTankView>
    {
        // IMixableTankView special implementation here
    }