是否可以使用模块化方法实现类?

时间:2014-07-01 20:49:00

标签: c# code-structure

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

Public Class PowerTool
{
...

  public virtual void DoPowerTool()
  {
  ...
  }

}

Public Interface Shape
{
  void DoShape(PowerTool p);
}

Public Interface Color
{
  void DoColor(PowerTool p);
}

由于DoShapeDoColor需要PowerTool,直观的做法是以某种方式将这些方法烘焙到PowerTool实例中。

不幸的是,我不能让PowerTool类直接实现Shape和Color,因为直到运行时我才会知道它是Red Square Jackahmmer还是Green Ovoid。

我已经涉足了C#的代表,感觉他们在这种情况下可能会有用,但我不熟悉如何在这个精确的场景中实现它们,我不确定他们是否'是正确的选择,给我我正在寻找的模块化行为。 (在这方面我可能被Javascript破坏,你可以简单地覆盖对象上的函数。)

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

2 个答案:

答案 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);
    }
}