0

我正在尝试创建一个对象,该对象可以调用 3 种方法之一来响应用户输入。我们称它们为 , DoShape,DoColorDoPowerTool。这些方法分别作为基类和接口的一部分存在:

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 宠坏了,你可以简单地覆盖对象上的函数)。

关于如何继续的任何想法或建议?我觉得可能有一个非常简单的解决方案,我在这一切中都忽略了。

4

2 回答 2

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());

等等..有很多方法可以给这只猫剥皮。

于 2014-07-01T23:12:56.900 回答
0

我相信您所指的是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);
    }
}
于 2014-07-01T21:31:08.427 回答