0

想象以下两个类:

class A
{
    public A()
    {
    }
}
class B : A
{
    public B()
    {
    }
}

我是否可以以强制 B 类具有无参数构造函数的方式定义 A 或接口?或者,更概括地说,一个能够创建具有给定签名的 B 类型实例的构造函数(或静态方法)?

不想将 B 类限制为只能使用该签名构造,但我想确保可以使用该签名构造 B 类(无论是无参数的,还是指定某些参数)。

需要明确的是:我不是在寻找需要我在运行时使用反射或任何其他方法来解决这个问题的解决方案(我对此没有问题,但它会使代码的可读性降低,而且通常在这种情况下似乎是个坏主意)。

有没有办法做到这一点?

我写了一篇博文,更深入地介绍了我在这里想要实现的目标

4

3 回答 3

1

没有可以应用于该类型的接口或基类型,以确保它具有无参数构造函数。您可以进行此类约束的唯一上下文是通用约束:

public static void Foo<T>()
    where T : new() {}

在这种情况下,唯一可以使用的类型Foo必须有一个无参数的构造函数。

于 2013-09-18T18:07:23.990 回答
0

A您可以为实例化类型(和派生类型)的对象定义工厂:

interface IFactory<T> where T : A
{
    T Create(int i);
    T Create(string s);
    // and so on...
}

并且需要工厂实现,当你想创建一个对象时。
这将确保在编译时调用代码,它会尝试使用给定的参数集创建一个对象。

当然,没有什么可以阻止运行时的NotImplementedException具体IFactory<T>实现。

于 2013-09-18T18:22:44.543 回答
0

这是一个后续,因为我做了一些研究,至少设法想出了一个有点令人满意的答案。

因此,在挖掘了一段时间并试图弄清楚 C# 中内置的序列化/反序列化是如何工作的之后,我发现 C# 有一个名为GetUninitializedObject(). 这个方法看起来像是一个 hack,因为它只是避免一开始就调用对象的构造函数,但它至少给了我一种方法来完成我最初想要的:能够反序列化任意类型的对象。使用它,我可以在未初始化的创建对象上使用方法(并通过接口强制实现它们)。

我发现这很符合我的需求,虽然它没有达到我最初想要的效果,但它允许我实现一种适合我的目的的模式。

此致

于 2013-09-19T02:57:19.777 回答