强制密封班

时间:2018-11-29 12:03:08

标签: c# sealed

在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逻辑中现在有未使用的属性。

2 个答案:

答案 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)

不,不是。

顺便说一句,您不是继承接口,而是实现接口,即,您仅提供对空方法的实现。