我最近在一次采访中,面试官问了我这个问题——
如何编写接口以限制或强制实现 仅通过泛型类型还是阻止提供实现?
有人可以用一些代码示例回答这个问题,或者提供带有示例片段的完全相同问题的任何参考以供理解。 可能吗?如果是,那么如何,如果否,那么为什么?
无法限制谁实现您的接口。
您可以给出的唯一限制是接口是通用的
- 例如
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{ }
我可以同时提供GenericConstraint
和NewGenericConstraint
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 { }
因此,提供一个通用参数,其中约束是密封类是没有意义的。因此,编译器强制您将泛型类型约束为非密封类