繁体   English   中英

C#中的基类...可以像接口一样继承吗?

[英]Base class in C#… that can be inherited from like an interface?

我需要为许多类实现基本行为。 举个例子,假设它是一种绘图行为:可以绘制许多不同类型的对象,它们都需要一些属性和一些通用代码来实现绘图过程。 假设我将这个常见部分放在一个名为Drawable的类中。

问题是这些不同的类可能正在扩展其他类,所以我不能让它们继承自Drawable。 显而易见的解决方案是使用接口(IDrawable),但是我无法在其中实现任何代码; 我能想到的另一个解决方案是使用组合,通过创建一个我所有类都可以实例化的DrawAction类,但这需要我在我需要制作的所有类中放入相同的代码(如果只是几行)绘制。

有人可以给我一些关于如何做的建议吗? 谢谢。

您可以创建DrawAction类的实例,然后使用构造函数依赖注入将其注入其他类,而不是通过每个类显式实例化它,这样可以减少耦合设计:

IDrawAction drawAction = new DrawAction();
var drawable = new Drawable(drawAction);

public class Drawable
{
    public Drawable(IDrawAction drawAction)
    {
    }
}

这可能是一种情况组成 ,而不是继承。

您可以在一个类中实现绘图行为,然后让所有需要它的类保持对它的引用。

如果您需要支持许多不同的绘图算法,您可能需要查看策略模式 在这里,您将实现许多不同的绘图算法,所有绘图算法都实现某种类型的接口,而需要绘制的对象将引用其中一个。

根据您的具体情况,如果某些类型的对象总是需要某种类型的绘图算法,则可以使用IoC容器(如StructureMapUnity)自动选择哪个绘图类。

这是DoFactory战略模式的一个例子

您可以为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();

缺点是扩展方法是静态的,你不能覆盖它们。

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

听起来Decorator模式可能适合您要实现的目标。

请参阅Decorator Pattern Wikipedia条目

  • 不要试图继承常见的“绘图”逻辑,而是将公共逻辑放在另一个类中,即“Draw * er *”
  • 当必须绘制一个对象时,将其传递给相应的Draw * er *(或者为它绘制一个Draw * er *)
  • 您仍然可以找到一个有用的IDrawable接口,以便可以针对已知接口编写Draw * er *代码。
  • 最终可能会有多个Draw * er *实现(在这种情况下,您需要为每个要绘制的对象处理相应Drawer的动态选择)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM