小编典典

定义构造函数签名的接口?

all

奇怪的是这是我第一次遇到这个问题,但是:

如何在 C# 接口中定义构造函数?

编辑
有些人想要一个例子(这是一个空闲时间项目,所以是的,这是一个游戏)

IDdrawable
+更新
+Draw

为了能够更新(检查屏幕边缘等)并绘制自己,它总是需要一个GraphicsDeviceManager.
所以我想确保该对象具有对它的引用。这将属于构造函数。

既然我写下来了,我想我在这里实现的是IObservable并且GraphicsDeviceManager应该采取IDrawable......似乎我没有得到
XNA 框架,或者框架没有被很好地考虑。

编辑
在接口的上下文中我对构造函数的定义似乎有些混乱。接口确实不能被实例化,所以不需要构造函数。我想要定义的是构造函数的签名。就像接口可以定义某个方法的签名一样,接口也可以定义构造函数的签名。


阅读 103

收藏
2022-03-06

共1个答案

小编典典

如前所述,您不能在接口上拥有构造函数。但由于这是大约 7 年后在 Google
中排名很高的结果,我想我会在这里插话——特别是展示如何将抽象基类与现有接口结合使用,并可能减少重构量将来需要类似的情况。一些评论已经暗示了这个概念,但我认为值得展示如何实际做到这一点。

因此,到目前为止,您的主界面如下所示:

public interface IDrawable
{
    void Update();
    void Draw();
}

现在使用要强制执行的构造函数创建一个抽象类。实际上,自从您编写原始问题以来,它现在就可用了,我们可以在这里稍微花点心思并在这种情况下使用泛型,以便我们可以将其调整到可能需要相同功能但具有不同构造函数要求的其他接口:

public abstract class MustInitialize<T>
{
    public MustInitialize(T parameters)
    {

    }
}

现在您需要创建一个继承自 IDrawable 接口和 MustInitialize 抽象类的新类:

public class Drawable : MustInitialize<GraphicsDeviceManager>, IDrawable
{
    GraphicsDeviceManager _graphicsDeviceManager;

    public Drawable(GraphicsDeviceManager graphicsDeviceManager)
        : base (graphicsDeviceManager)
    {
        _graphicsDeviceManager = graphicsDeviceManager;
    }

    public void Update()
    {
        //use _graphicsDeviceManager here to do whatever
    }

    public void Draw()
    {
        //use _graphicsDeviceManager here to do whatever
    }
}

然后只需创建一个 Drawable 实例就可以了:

IDrawable drawableService = new Drawable(myGraphicsDeviceManager);

这里很酷的是,我们创建的新 Drawable 类的行为仍然与我们对 IDrawable 的期望相同。

如果您需要将多个参数传递给 MustInitialize 构造函数,您可以创建一个类来定义您需要传入的所有字段的属性。

2022-03-06