如何将接口限制为仅由泛型类型实现

  • 本文关键字:泛型类型 实现 接口 c# oop
  • 更新时间 :
  • 英文 :


我最近在一次采访中,面试官问了我这个问题——

如何编写接口以限制或强制实现 仅通过泛型类型还是阻止提供实现?

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

无法限制谁实现您的接口。

您可以给出的唯一限制是接口是通用的

  • 例如public interface IInterface<T> { }

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

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

GenericConstraint限制也可以是以下内容:

  • 结构
  • .class
  • 非 托管
  • 新((
  • 基类名
  • 接口名称
  • 另一个泛型类型

有关可用约束的详细信息,请参阅 MS 文档 - 类型参数的约束

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

MS 文档 - 泛型(C# 编程指南(

RE:"其中 T "可以是任何类型的类,或者我可以强制它是某种特定的类型?你能提供一些关于这个的片段吗?

如果使用特定的类名:

类型参数必须是指定的基类或派生自指定的基类。

因此,如果我有以下类:

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

我可以同时提供GenericConstraintNewGenericConstraintIInterface<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 { }

因此,提供一个通用参数,其中约束是密封类是没有意义的。因此,编译器强制您将泛型类型约束为非密封类

最新更新