小编典典

接口定义构造函数签名?

c#

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

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

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

IDrawable
+更新
+绘制

为了能够更新(检查屏幕边缘等)并绘制自身,它将始终需要GraphicsDeviceManager。因此,我想确保该对象具有对它的引用。这将属于构造函数。

现在,我写下来我想我在这里实施的IObservableGraphicsDeviceManager应该采取的IDrawable......看来要么我不明白的XNA框架或框架不是想出来的非常好。

编辑
在接口上下文中,关于我对构造函数的定义似乎有些困惑。接口确实无法实例化,因此不需要构造函数。我想定义的是构造函数的签名。就像接口可以定义某种方法的签名一样,接口可以定义构造函数的签名。


阅读 565

收藏
2020-05-19

共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构造函数,则可以创建一个类,为需要传递的所有字段定义属性。

2020-05-19