我最近接受采访时面试官问我这个问题 -
如何编写接口以限制或强制仅通用类型实现或阻止提供实现?
有人可以用一些代码示例回答这个问题,或者提供与样本片段完全相同的问题的任何参考,以便理解.可能吗?如果是,那么如何,如果否,那么为什么?
无法限制谁实现您的界面.
您可以给出的唯一限制是接口是通用的
public interface IInterface<T> { }您还可以T将接口的通用限制为某种类型.
public interface IInterface<T> where T : GenericConstraint { }此GenericConstraint限制还可以是以下内容:
有关可用约束的更多信息,请参阅MS Docs - 类型参数约束
正如@Saruman指出的那样,强烈建议阅读:
如果您使用特定的类名:
type参数必须是或从指定的基类派生.
因此,如果我有以下课程:
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 { }因此,提供一个约束是密封类的通用参数是没有意义的.因此,编译器会强制您将泛型类型约束为非密封类