我正在尝试创建一个对象,可以调用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类直接实现Shape和Color,因为直到运行时我才会知道它是Red Square Jackahmmer还是Green Ovoid。
我已经涉足了C#的代表,感觉他们在这种情况下可能会有用,但我不熟悉如何在这个精确的场景中实现它们,我不确定他们是否'是正确的选择,给我我正在寻找的模块化行为。 (在这方面我可能被Javascript破坏,你可以简单地覆盖对象上的函数。)
有关如何继续的任何想法或建议?我觉得这可能是一个非常简单的解决方案,我忽略了这一切。
答案 0 :(得分:1)
一个相对简单的方法来做你正在谈论的事情(据我所知)将只是简单地有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());
等等。有很多方法可以给这只猫上皮。
答案 1 :(得分:0)
我相信你所指的是Mixin的概念。
这是定义接口的一个或多个实现的地方,然后将实现重用于它们的具体类型。
遗憾的是,这在.NET中并不可行,因为该框架在没有使用多重继承的能力的情况下被设计。但是,您可以使用extension methods或通过依赖注入和strategy pattern来复制您正在寻找的行为。
如果您对模式有任何进一步的疑问,或者需要更多适用的示例,请告诉我您正在尝试更详细地完成的内容,我会尽力提供帮助。
如果我理解您所描述的内容,以下策略模式可能会有所帮助:
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);
}
}