在C#中可以通过接口或通配符强制密封类吗?例如:
public interface A<SealedItem> where SealedItem : sealed或者可能是这样:
public sealed interface A {}
public class B : A // B is now sealed.这听起来可能很奇怪,但我想“强制”一个密封的例子的惯例震动。像这样的东西存在吗?
额外的上下文:我有通过API公开的请求对象。我只使用request对象来“读取”数据。这些请求对象可能会随着时间的推移而改变,但是,我不希望这些请求对象相互影响。在我的请求对象中使用继承会导致“问题”。所以在我看来,“强迫”一个密封类会更好。
为什么继承在我的情况下是不好的:假设我有以下请求:
public class RequestA { public int Number { get; set; } }
public class RequestB : RequestA { public int Id { get; set; } }两个请求都使用此示例中的值号。假设RequestA的实现发生了变化,它不再需要number值了。我的请求B代码现在将中断(只是一个小例子)。另一个例子是,当RequestA获得请求B不使用的新属性时,我现在的RequestB逻辑中有一个未使用的属性。
发布于 2018-11-29 12:09:52
不这是不可能的。
类是sealed这一事实仅仅意味着它不能被继承。
例如:
public interface A<SealedItem> where SealedItem : sealed
您只能对控制如何使用类型的事情使用泛型约束--如果它是一个类或一个结构,如果它实现了一个接口,或者它是从一个特定的类型派生出来的,或者它有一个不需要参数的公共构造函数。
或者类似于:
public sealed interface A {}
接口不能标记为sealed。
要防止继承,可以做的一件事是使用值类型--结构不能从ValueType特殊类以外的任何东西继承(这超出了您的控制范围),也不能从-
结构不能从另一个结构或类继承,也不能作为类的基础。
但是,在大多数情况下,这可能不是一个很好的选择,特别是如果您需要代码中的引用类型语义(在大多数情况下,您需要引用类型语义)。
update -后面是对问题的更新:
额外的上下文:我有通过API公开的请求对象。这些请求对象可能会随着时间的推移而改变,但是,我不希望这些请求对象相互影响。
您可以将所有请求类创建为密封的--并在代码中保留注释,以便对请求进行密封,并解释原因--但这可能是您所能做的一切,除了使用structs而不是类(如果只用于API请求,这可能不是个坏主意)。
查看在阶级和结构之间的选择,看看您的请求是否符合指南:
✓考虑定义一个结构,而不是一个类,如果该类型的实例很小且通常是短暂的,或者通常嵌入到其他对象中。 X避免定义结构,除非该类型具有以下所有特性:
在所有其他情况下,您应该将类型定义为类。
发布于 2018-11-29 12:05:23
不,它不是。
顺便说一句,您不是继承接口,而是实现接口,也就是说,您只需为空方法提供实现。
https://stackoverflow.com/questions/53538642
复制相似问题