理论问题的种类。相当长的时间,如果你没有理论的心情,可以随意跳过。是否有可能在C#中为泛型创建“此类型”?
想象一下,你有两个类,一个从另一个继承。基类是通用的,并且在关闭类型中必须返回该关闭类型的某个实例。
像这样(注意:???文本):
public class Adapter<T>
{
public virtual ??? DoSomething()
{
...
}
}
public class AdaptedString : Adapter<String>
{
public override AdaptedString DoSomething()
{
...
}
}
,因为没有办法来指代从一个泛型类型派生封闭式我不能这样做。 (对于破碎的语言,抱歉,只是不知道如何表达它。)没有设置关键字来代替???
来指定此方法将返回将从此泛型类型派生的类型实例。
相反,我可以使用显式传递类型名称到泛型基地的解决方法。但它看起来多余。
public class Adapter<TThis,T>
{
public virtual TThis DoSomething()
{
...
}
}
public class AdaptedString : Adapter<AdaptedString,String>
{
public override AdaptedString DoSomething()
{
...
}
}
如果在基类中我需要访问TThis
实例的成员,我要补充的约束。这一次,它看起来丑陋 - 注意约束:
public class Adapter<TThis,T>
where TThis : Adapter<TThis, T>
{
protected int _field;
...
public bool Compare(TThis obj)
{
return _field == obj._field;
}
}
public class AdaptedString : Adapter<AdaptedString,String>
{
...
}
是的,这是所有工作,但它会更好看,如果我可以简单地使用一些关键字,而不是???
在第一个代码片段。类似于“thistype”。
您认为它会起什么作用?它有用吗?或者,也许这只是简单的愚蠢?
+1我站在更正:) –
乔恩,在你的例子中的第二行只是不同的东西,不落入这种模式。如果有必要,可以通过现有的语法来实现。 我只是觉得这个语法让我的例子更加复杂。在我们的代码中发现错误后,我写了这篇文章。前一段时间我最初编写了这个基类,但我不得不重读几遍以再次抓握。难怪其他人介绍了一个bug。 – XOR
@XOR:我的观点是第二行是* legal *,但不受欢迎(在这种情况下)。我将编辑答案以使其更清楚。 –