C# 如何使用MVP模式处理不同的接口实现?
我有一个正在进行的设计,我想弄清楚如何使用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
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%的功能是相同的,因此看起来是多余的。事实上,我不止有两个坦克,实际的实现要复杂得多,但每种坦克类型只有细微的差别
我的目标是:
- 为了我自己的理智,我想减少代码的数量
- 我真的需要每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
}