我需要为许多类实现基本行为。举个例子,假设它是一种绘图行为:可以绘制许多不同类型的对象,它们都需要一些属性和一些通用代码来实现绘图过程。假设我将这个常见部分放在一个名为Drawable的类中。
问题是这些不同的类可能正在扩展其他类,所以我不能让它们继承自Drawable。显而易见的解决方案是使用接口(IDrawable),但是我无法在其中实现任何代码;我能想到的另一个解决方案是使用组合,通过创建一个我所有类都可以实例化的DrawAction类,但这需要我在我需要制作的所有类中放入相同的代码(如果只是几行)绘制。
有人可以就如何做到这一点给我建议吗?谢谢。
答案 0 :(得分:5)
您可以创建DrawAction
类的实例,然后使用构造函数依赖注入将其注入其他类,而不是通过每个类显式实例化它,这样可以减少耦合设计:
IDrawAction drawAction = new DrawAction();
var drawable = new Drawable(drawAction);
public class Drawable
{
public Drawable(IDrawAction drawAction)
{
}
}
答案 1 :(得分:4)
这可能是composition的情况,而不是继承。
您可以在一个类中实现绘图行为,然后让所有需要它的类保持对它的引用。
如果您需要支持许多不同的绘图算法,您可能需要查看Strategy Pattern。在这里,您将实现许多不同的绘图算法,所有绘图算法都实现某种类型的接口,而需要绘制的对象将引用其中一个。
根据您的具体情况,如果某些类型的对象始终需要某种类型的绘图算法,则可以使用IoC容器选择哪个绘图类,例如StructureMap或{{3} }。
以下是Unity
的策略模式示例答案 2 :(得分:2)
您可以为IDrawable
创建扩展方法:
public static class DrawableExtensions
{
public static int CalculateSize(this IDrawable drawable)
{
return drawable.Width * drawable.Height;
}
}
这样,这些方法可以在IDrawable
界面上显示:
IDrawable d = new Circle();
int size = d.CalculateSize();
缺点是扩展方法是静态的,你不能覆盖它们。
答案 3 :(得分:1)
C#不支持多重继承。停止。你不能这样做。 你说的是“Mixins”......在C#中仍然不支持。
但是,您可以使用多种替代方案。
更简单的方法是使用Mixin类,您可以将其添加为所有类中的字段。 例如......
public class DrawerMixin
{
public void DrawRectangle() { ... }
}
public class MyClass1 : Component
{
public DrawerMixin Drawer { get; private set; }
public MyClass1()
{
this.Drawer = new DrawerMixin(this);
}
public MyClass1(DrawerMixin drawer)
{
this.Drawer = drawer;
}
public void MyFunc()
{
...
this.Drawer.DrawRectangle();
}
}
答案 4 :(得分:1)
听起来装饰师模式可能适合你想要实现的目标。
See Decorator Pattern Wikipedia entry