我最近一直在接受采访,面试官问我这个问题-
如何编写接口以限制或强制实施 只是通用类型还是阻止提供实现?
有人可以用一些代码示例回答这个问题,还是可以通过示例代码片段提供对完全相同的问题的任何参考,以供理解。 可能吗?如果是,那么如何;如果不是,那么为什么?
答案 0 :(得分:6)
不可能限制谁实现您的界面。
您可以提供的唯一限制是接口必须通用
public interface IInterface<T> { }
您还可以将接口的通用T
限制为某种类型。
public interface IInterface<T> where T : GenericConstraint { }
此GenericConstraint
限制还可以如下:
有关可用约束的更多信息,请参见MS Docs - Constraints on type parameters
正如@Saruman所指出的,强烈建议阅读:
MS Docs - Generics (C# Programming Guide)
如果使用特定的类名:
type参数必须是指定基类或从指定基类派生。
因此,如果我有以下课程:
public class GenericConstraint { }
public class NewGenericConstraint : GenericConstraint{ }
我可以同时向{{1}提供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 { }
因此,提供约束为密封类的通用参数将毫无意义。因此,编译器会强制您将泛型类型限制为非密封类