定义构造函数签名的接口?
奇怪的是,这是我第一次碰到这个问题,但是:
你如何在C#界面中定义构造函数?
编辑
有些人想要一个例子(这是一个自由时间项目,所以是的,这是一个游戏)
IDrawable
+更新
+绘制
为了能够更新(检查屏幕边缘等)并绘制自己,它总是需要一个GraphicsDeviceManager
。 所以我想确保对象有一个参考。 这将属于构造函数。
现在我写下来了,我想我在这里实现的是IObservable
, GraphicsDeviceManager
应该采用IDrawable
......看起来要么我没有得到XNA框架,要么框架没有被很好地思考。
编辑
在界面的上下文中,我对构造函数的定义似乎有些混淆。 一个接口确实不能实例化,所以不需要构造函数。 我想要定义的是构造函数的签名。 完全像接口可以定义特定方法的签名,接口可以定义构造函数的签名。
正如已经注意到的那样,你不能在接口上使用构造函数。 但是,由于这是在7年后谷歌这样一个高度排名的结果,我认为我会在这里 - 特别是显示如何使用抽象基类与您现有的接口并列,并可能减少重构的数量在未来需要类似的情况。 这个概念已经在一些评论中暗示了,但我认为值得展示如何真正做到这一点。
所以你的主界面看起来像这样:
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构造函数,则可以创建一个类,为您需要传入的所有字段定义属性。
你不能。 偶尔会有一种痛苦,但是无论如何你都不能用普通技术来调用它。
在一篇博客文章中,我提出了一些静态接口,这些接口只能用于泛型类型的限制 - 但可能非常方便,IMO。
关于如果可以在界面中定义构造函数的一点,你很难派生类:
public class Foo : IParameterlessConstructor
{
public Foo() // As per the interface
{
}
}
public class Bar : Foo
{
// Yikes! We now don't have a parameterless constructor...
public Bar(int x)
{
}
}
一个很晚的贡献,展示了接口构造函数的另一个问题。 (我选择这个问题是因为它对问题有清晰的表达)。 假设我们可以有:
interface IPerson
{
IPerson(string name);
}
interface ICustomer
{
ICustomer(DateTime registrationDate);
}
class Person : IPerson, ICustomer
{
Person(string name) { }
Person(DateTime registrationDate) { }
}
按照惯例,“接口构造函数”的实现由类型名称替换。
现在创建一个实例:
ICustomer a = new Person("Ernie");
我们是否会说遵守ICustomer
合约?
那这个怎么样:
interface ICustomer
{
ICustomer(string address);
}
链接地址: http://www.djcxy.com/p/37679.html
上一篇: Interface defining a constructor signature?
下一篇: How would you count occurrences of a string (actually a char) within a string?