想象一下以下两个类:
class A
{
public A()
{
}
}
class B : A
{
public B()
{
}
}
我是否有可能以强制B类具有无参数构造函数的方式定义A或接口?或者,更通用的是,能够使用给定签名创建类型B的实例的构造函数(或静态方法)?
我不想要将B类限制为只能使用该签名进行构造,但我想确保使用此签名构建B 类(是它无参数,或指定某些参数)。
要明确:我不是在寻找一个需要我在运行时使用Reflection或任何其他方法来解决这个问题的解决方案(我没有遇到问题,但它会降低代码的可读性,在这种情况下通常看起来不错。)
有没有办法实现这个目标?
我写了一篇博文,更深入地了解了我想要实现的目标here
答案 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()
的方法。这个方法看起来像是一个黑客,因为它只是避免首先调用对象的构造函数,但它至少给了我一种方法来完成我最初想要的东西:能够反序列化任意类型的对象。使用这个,我可以在未初始化的创建对象上使用方法(并通过接口强制实现它们)。
我发现这符合我的需要,虽然它没有做我原本想要的,它允许我实现一个适用于我的目的的模式。
最好的问候