如何限制仅由通用类型实现的接口

时间:2018-09-16 10:17:40

标签: c# oop

我最近一直在接受采访,面试官问我这个问题-

  

如何编写接口以限制或强制实施   只是通用类型还是阻止提供实现?

有人可以用一些代码示例回答这个问题,还是可以通过示例代码片段提供对完全相同的问题的任何参考,以供理解。 可能吗?如果是,那么如何;如果不是,那么为什么?

1 个答案:

答案 0 :(得分:6)

不可能限制谁实现您的界面。

您可以提供的唯一限制是接口必须通用

  • 例如public interface IInterface<T> { }

您还可以将接口的通用T限制为某种类型。

  • 例如public interface IInterface<T> where T : GenericConstraint { }

GenericConstraint限制还可以如下:

  • 结构
  • 课程
  • 不受管理
  • new()
  • 基类名称
  • 接口名称
  • 另一种通用类型

有关可用约束的更多信息,请参见MS Docs - Constraints on type parameters

正如@Saruman所指出的,强烈建议阅读:

MS Docs - Generics (C# Programming Guide)

RE:“ where T”可以是任何类型的类,或者我可以强制执行某种特定类型的类吗?您能提供一些摘要吗?

如果使用特定的类名:

  

type参数必须是指定基类或从指定基类派生。

因此,如果我有以下课程:

  • public class GenericConstraint { }
  • public class NewGenericConstraint : GenericConstraint{ }

我可以同时向{{1}提供GenericConstraintNewGenericConstraint,因为它们都是IInterface<T> where T : GenericConstraint或从GenericConstraint派生的。

因此以下类将有效:

  • public class Subject : IInterface<GenericConstraint> { }
  • public class Subject : IInterface<NewGenericConstraint> { }
  • public class Subject<T> : IInterface<T> where T : GenericConstraint { }
  • public class Subject<T> : IInterface<T> where T : NewGenericConstraint { }

GenericConstraint不能是密封类,因为如果GenericConstraint是密封的,例如:

  • public sealed class GenericConstraint { }

您将无法继承它,并且以下内容将无法编译:

  • public class NewGenericConstraint : GenericConstraint { }

因此,提供约束为密封类的通用参数将毫无意义。因此,编译器会强制您将泛型类型限制为非密封类