在C#中是否可以通过接口或通配符强制密封类?例如:
public interface A<SealedItem> where SealedItem : sealed
或类似的东西:
public sealed interface A {}
public class B : A // B is now sealed.
这听起来可能很奇怪,但是我想“强制”一个密封的实例以防止惯例动摇。这样的东西存在吗?
额外上下文:我有通过API公开的请求对象。我仅将请求对象用于“读取”数据。这些请求对象可能会随时间变化,但是,我不希望这些请求对象相互影响。在我的请求对象中使用继承会导致“问题”。因此,以我为例,“强制”密封类会很好。
为什么在我的情况下继承可能很糟糕:假设我有以下要求:
public class RequestA { public int Number { get; set; } }
public class RequestB : RequestA { public int Id { get; set; } }
在此示例中,两个请求都使用值编号。假设RequestA的实现发生了变化,并且不再需要number
值。我对请求B的代码现在将中断(仅是一个小例子)。另一个示例是当RequestA获得请求B未使用的新属性时。我的RequestB逻辑中现在有未使用的属性。
答案 0 :(得分:3)
不,这不可能。
该类为sealed
的事实只是意味着它不能被继承。
例如类似:
public interface A<SealedItem> where SealedItem : sealed
您只能对用于控制类型使用方式的事物使用通用约束-如果是类或结构,实现接口或从特定类型派生的,或者具有不使用任何类型的公共构造函数参数。
,或者类似:
public sealed interface A {}
接口不能标记为sealed
。
防止继承的一件事是使用值类型-结构不能从ValueType
特殊类之外的任何其他东西继承(这超出了您的控制范围),也不能从其中继承-
来自Structs (C# Programming Guide):
一个结构不能从另一个结构或类继承,也不能作为一个类的基础。
但是,在大多数情况下,这可能不是一个好选择,尤其是在您的代码中需要引用类型语义的情况下(在大多数情况下,您确实需要这样做)。
更新-随后是问题的更新:
额外上下文:我有通过API公开的请求对象。这些请求对象可能会随时间变化,但是,我不希望这些请求对象相互影响。
您可以将所有请求类创建为密封的-并在代码中留下注释以供将来的开发使用,以密封请求,并说明原因-但这可能是您所能做的,除了使用结构而不是类(可能不会)如果仅用于API请求,则是个坏主意。)
查看Choosing Between Class and Struct,看看您的请求是否符合准则:
✓考虑,如果类型的实例较小且通常为短寿命或通常嵌入在其他对象中,则定义结构而不是类。
除非结构具有以下所有特征,否则X AVOID 定义结构:
- 它在逻辑上表示一个值,类似于基本类型(int,double等)。
- 实例大小小于16个字节。
- 这是一成不变的。
- 不必经常装箱。
在所有其他情况下,应将类型定义为类。
答案 1 :(得分:0)
不,不是。
顺便说一句,您不是继承接口,而是实现接口,即,您仅提供对空方法的实现。