使用统一签名创建不同类型的对象

时间:2013-09-18 18:05:07

标签: c# serialization interface constraints factory

想象一下以下两个类:

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

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

想要将B类限制为只能使用该签名进行构造,但我想确保使用此签名构建B (是它无参数,或指定某些参数)。

要明确:我不是在寻找一个需要我在运行时使用Reflection或任何其他方法来解决这个问题的解决方案(我没有遇到问题,但它会降低代码的可读性,在这种情况下通常看起来不错。)

有没有办法实现这个目标?

我写了一篇博文,更深入地了解了我想要实现的目标here

3 个答案:

答案 0 :(得分:1)

没有可以应用于类型的接口或基类型,以确保它具有无参数构造函数。你可以制定这种约束的唯一背景是通用约束:

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

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

答案 1 :(得分:0)

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

interface IFactory<T> where T : A
{
    T Create(int i);
    T Create(string s);
    // and so on...
}
当你想要创建一个对象时,

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

当然,在运行时没有阻止NotImplementedException从具体IFactory<T>实现。

答案 2 :(得分:0)

这是一个后续行动,因为我做了一些研究,至少设法得到了一个令人满意的答案。

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

我发现这符合我的需要,虽然它没有做我原本想要的,它允许我实现一个适用于我的目的的模式。

最好的问候