我试图创建一个对象,可以调用3种方法之一响应用户输入。我们称它们为,DoShape
, DoColor
和DoPowerTool
。这些方法分别作为基类和接口的一部分存在:
Public Class PowerTool
{
...
public virtual void DoPowerTool()
{
...
}
}
Public Interface Shape
{
void DoShape(PowerTool p);
}
Public Interface Color
{
void DoColor(PowerTool p);
}
由于DoShape
和DoColor
需要一个PowerTool,直观的做法是将这些方法以某种方式烘烤到PowerTool实例本身。
不幸的是,我不能让PowerTool类直接实现形状和颜色,因为直到运行时我才知道它是红色方形的Jackahmmer还是绿色的Ovoid。
我曾经接触过c#的委托,并且有一种感觉,它们在这种情况下可能是有用的,但是我不够熟悉,不知道如何在这种精确的场景中实现它们,而且我不确定它们是否是给我提供我正在寻找的模块化行为的正确选择。(在这方面,我可能被Javascript宠坏了,你可以简单地覆盖对象上的函数)。
对如何继续有什么想法或建议吗?我觉得我可能忽略了一个很简单的解决方法
一种相对简单的方法可以做到你所说的(从我看来)是简单地有3个接口:
public interface IPowerTool : IShape, IColor
{
void Execute();
}
因此,您可以简单地定义:
public RedSquareJackhammer : IPowerTool
{
void DoShape() {}
void DoColor() {}
void Execute() {}
}
另一个选项是这样做:
public PowerTool
{
IColor color;
IShape shape;
public PowerTool(IColor c, IShape s) {
color = c; share = s;
}
void Execute() {
color.DoColor();
shape.DoShape();
}
}
然后像这样调用它:
// JackHammer is derived from PowerTool, Red from IColor, Square from IShape
var redSquareJackhammer = new JackHammer(new Red(), new Square());
等。
我相信你指的是Mixin的概念。
定义一个接口的一个或多个实现,然后为它们的具体类型重用这些实现。
不幸的是,这在。net中是不可能的,因为该框架在设计时就没有使用多重继承的能力。但是,您可以使用扩展方法,或者通过依赖注入和策略模式来复制您正在寻找的行为。
如果您对模式有任何进一步的问题,或者需要更多适用的示例,请告诉我您想要更详细地完成什么,我会尽我所能帮助您。
如果我理解你所描述的,下面的策略模式可能是有益的:
internal interface IPowerToolStrategy
{
void Execute(PowerTool powerTool);
}
public class RedSquareJackhammer : IShape
{
private readonly IPowerToolStrategy _strategy;
internal RedSquareJackhammer(IPowerToolStrategy strategy)
{
_strategy = strategy;
}
public void DoShape(PowerTool powerTool)
{
_strategy.Execute(powerTool);
}
}