加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否可以在C#中为泛型制作“此类型”?

发布时间:2020-12-15 19:32:43 所属栏目:百科 来源:网络整理
导读:一种理论问题.很长一段时间,如果你没有理论的心情,请随意跳过. 想象一下,你有两个类,一个继承自另一个.基类是通用的,并且有一个方法,在闭合类型中必须返回此闭合类型的某个实例. 像这样(注意文字中的???): public class AdapterT{ public virtual ??? DoSom
一种理论问题.很长一段时间,如果你没有理论的心情,请随意跳过.

想象一下,你有两个类,一个继承自另一个.基类是通用的,并且有一个方法,在闭合类型中必须返回此闭合类型的某个实例.

像这样(注意文字中的???):

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”这样的东西.

您认为它如何运作?它有用吗?或者这可能只是愚蠢的?

解决方法

没有任何东西可以使这种模式更容易,事实上这种模式无论如何都不是防弹 – 因为你可以:

class TypeA : Adapter<TypeA,string>

class TypeB : Adapter<TypeA,string> // Bug!

这里的第二行完全合法 – TypeA是TThis类型参数的有效类型参数,即使它不是我们想要的.基本上,类型系统不允许我们表达“T必须是这种类型”的概念.

然而,我不同意那些说这是一种坏的或无用的模式的人.我发现它在Protocol Buffers中很有用(如果复杂) – 没有它会更糟糕.例如:

Foo foo = new Foo.Builder { Name="Jon" }.Build();

如果Foo.Build()没有强类型返回Foo,即使在IBuilder< ...>中指定了Build方法,也无法工作.

如果你很容易就可以避免这种情况,因为它变得如此复杂 – 但我确实认为这是一个有用的模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读