c#多个抽象类的组合设计

本文关键字:组合 抽象类 | 更新日期: 2023-09-27 18:13:16

我准备在Monogame一个小的游戏引擎,在那里我想有一些像gameObject组成的DrawableObject和ClickHandler(即:

)
public class GameObject : DrawableObject, ClickHandler

问题是- c#不支持多重继承,我需要使用接口。我已经制作了DrawableObject和ClickHandler抽象类,所以它们可以有一些已经实现的功能。

public abstract class ClickHandler
{
    public class NullClick : ClickHandler
    {
        public override void Click(Point mousePos)
        {
            Debug.Print("Clicked on: " + mousePos + ". NullClickHandler assigned");
        }
    }
    private readonly byte _handlerId;
    public static readonly NullClick NullClickHandler = new NullClick();
    private ClickHandler() {}
    public ClickHandler(ref ClickMap clickMap)
    {
        _handlerId = clickMap.registerNewClickHandler(this);
    }
    public abstract void Click(Point mousePos);
    void unregisterHandler(ref ClickMap clickMap)
    {
        clickMap.releaseHandler(_handlerId);
    }
}
class DrawableObject
{
    Texture2D texture;
    public Rectangle position;
    public DrawableObject()
    {
        position = Rectangle.Empty;
    }
    void Load(ref GraphicsDevice graphics)
    {
        using (var stream = TitleContainer.OpenStream("Content/placeholder.jpg"))
        {
            texture = Texture2D.FromStream(graphics, stream);
            position.Width = texture.Width;
            position.Height = texture.Height;
        }
    }
    void Draw(){} //here is going to be some default implementation
}

有什么建议我可以重新设计这个,以便能够实现它吗?我不想把整个实现移动到每个类中,我派生这个接口。

c#多个抽象类的组合设计

在CodeProject上有一个解决方案:c#的模拟多重继承模式

下面是一个最有趣的部分的例子:

class Aaux : A
{
    C CPart;
    m1();
    static implicit operator C(Aaux a)
    {
        return a.CPart;
    }
}
class Baux : B
{
    C CPart;
    m2();
    static implicit operator C(Baux b)
    {
        return b.CPart;
    }
}
class C
{
    Aaux APart;
    Baux BPart;
    m1()
    {
        APart.m1();
    }
    m2()
    {
        BPart.m2();
    }
    static implicit operator A(C c)
    {
        return c.APart;
    }
    static implicit operator B(C c)
    {
        return c.BPart;
    }
}