【问题标题】:C# Multiple abstract class composition design [duplicate]C#多个抽象类组合设计[重复]
【发布时间】:2017-02-26 01:09:53
【问题描述】:

我正在 Monogame 中准备一个小游戏引擎,在那里我想要由 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# object-composition


    【解决方案1】:

    CodeProject上有解决方案:The simulated multiple inheritance pattern for 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;
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多