如何将接口限制为仅通用类型实现

Log*_*esk -1 c# oop

我最近接受采访时面试官问我这个问题 -

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

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

Mic*_*han 6

无法限制谁实现您的界面.

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

  • 例如 public interface IInterface<T> { }

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

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

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

  • 结构
  • 非托管
  • 新()
  • 基类名称
  • 界面名称
  • 另一种通用类型

有关可用约束的更多信息,请参阅MS Docs - 类型参数约束

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

MS Docs - 泛型(C#编程指南)

RE:"哪里T"可以是任何类别,或者我可以强制执行某种特定类型?你能提供一些片段吗?

如果您使用特定的类名:

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

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

  • 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 { }

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