C# 可以用模块化方法实现类吗?

C# 可以用模块化方法实现类吗?,c#,code-structure,C#,Code Structure,我正在尝试创建一个对象,它可以调用3个方法中的一个来响应用户输入。让我们叫它们,DoShape,DoColor,和DoPowerTool。这些方法分别作为基类和接口的一部分存在: Public Class PowerTool { ... public virtual void DoPowerTool() { ... } } Public Interface Shape { void DoShape(PowerTool p); } Public Interface Co

我正在尝试创建一个对象,它可以调用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类直接实现形状和颜色,因为我要到运行时才能知道它是红色的正方形还是绿色的卵形

我已经涉猎过C#的委托,我觉得它们在这种情况下可能有用,但我不太熟悉,不知道如何在这个精确的场景中实现它们,我不确定它们是否是我所寻找的模块化行为的正确选择。(在这方面,我可能被Javascript搞坏了,在Javascript中,您可以简单地覆盖对象上的函数)


对如何继续下去有什么想法或建议吗?我觉得可能有一个非常简单的解决方案,我忽略了所有这一切。

我相信你所指的是a的概念

在这里定义了一个接口的一个或多个实现,然后将这些实现用于其具体类型

不幸的是,在.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);
    }
}

一个相对简单的方法来做你所说的(据我所知),就是简单地有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());

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

这是大量的文本和很少的代码。回答标题:您可能对模板方法模式(可能与策略相结合)或
partial
方法感兴趣。否则,您最好提供一个演示当前问题的代码示例。您的示例没有太多直观的意义。
DoShape()
方法做什么?我不知道。你能给我们看一下你的实际代码的简化版本吗?@Blorgbeard这个方法所做的与此无关(因为它可以做许多不同的事情之一,这取决于接口实现的内容)。与此相关的是对接口方法的访问和对powertool成员的访问。描述我所寻找的最简单的方法是“动态继承”,其中类使用的接口的实现在构建时确定。这就是通过依赖项注入的策略模式。您可以将该方法的实现注入使用它的类的构造函数中。我不熟悉战略模式。它似乎也很容易实现(事实上,这是我曾经考虑过的,虽然不是名字)。如果你仍然有问题,让我知道,我会根据需要修改我的答案。否则,请标记并完整回答。:)关于第一个:我想避免定义
RedSquareJackhammer
。。。因为如果我定义那个,我必须定义蓝色的组合;黄色的;和Puce,三角形;卵形体;菱形和手提钻;电动绞车;还有钉子枪。(等等)组合数学只是让这样的解决方案站不住脚。@Ravendramer-我给了你两个不同的选择。第二个版本允许您单独定义它们。