我有一个正在设计的设计,想弄清楚如何使用MVP模式处理接口的多个实现。这是我的情况:
有一个基本的“ Tank”界面,它定义了坦克应该做什么的基本功能。
public interface ITankView
{
public string TankName
public double TankLevel
public double TankSize
... ext ...
}
我的演示者接受此接口的实现(即-“ Tank”视图):
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;}
}
所以我的问题是,在遵循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!!
}
}
我想我需要为每种类型的Tank添加演示者。因此,在此示例中,它将是IBasicTankPresenter和IMixingTankPresenter,但对于如何工作我还是有些困惑。两个水箱之间的功能也有90%是相同的,因此显得多余。实际上,我拥有的坦克不止2个,实际的实现要复杂得多,但是每种坦克的类型只有微小的差异。
我的目标是:
答案 0 :(得分: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原则。 / p>