首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制密封类

强制密封类
EN

Stack Overflow用户
提问于 2018-11-29 12:03:07
回答 2查看 430关注 0票数 0

在C#中可以通过接口或通配符强制密封类吗?例如:

代码语言:javascript
复制
public interface A<SealedItem> where SealedItem : sealed

或者可能是这样:

代码语言:javascript
复制
public sealed interface A {}
public class B : A // B is now sealed.

这听起来可能很奇怪,但我想“强制”一个密封的例子的惯例震动。像这样的东西存在吗?

额外的上下文:我有通过API公开的请求对象。我只使用request对象来“读取”数据。这些请求对象可能会随着时间的推移而改变,但是,我不希望这些请求对象相互影响。在我的请求对象中使用继承会导致“问题”。所以在我看来,“强迫”一个密封类会更好。

为什么继承在我的情况下是不好的:假设我有以下请求:

代码语言:javascript
复制
public class RequestA { public int Number { get; set; } }
public class RequestB : RequestA { public int Id { get; set; } }

两个请求都使用此示例中的值号。假设RequestA的实现发生了变化,它不再需要number值了。我的请求B代码现在将中断(只是一个小例子)。另一个例子是,当RequestA获得请求B不使用的新属性时,我现在的RequestB逻辑中有一个未使用的属性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-29 12:09:52

不这是不可能的。

类是sealed这一事实仅仅意味着它不能被继承。

例如:public interface A<SealedItem> where SealedItem : sealed

您只能对控制如何使用类型的事情使用泛型约束--如果它是一个类或一个结构,如果它实现了一个接口,或者它是从一个特定的类型派生出来的,或者它有一个不需要参数的公共构造函数。

或者类似于:public sealed interface A {}

接口不能标记为sealed

要防止继承,可以做的一件事是使用值类型--结构不能从ValueType特殊类以外的任何东西继承(这超出了您的控制范围),也不能从-

来自结构(C#编程指南)

结构不能从另一个结构或类继承,也不能作为类的基础。

但是,在大多数情况下,这可能不是一个很好的选择,特别是如果您需要代码中的引用类型语义(在大多数情况下,您需要引用类型语义)。

update -后面是对问题的更新:

额外的上下文:我有通过API公开的请求对象。这些请求对象可能会随着时间的推移而改变,但是,我不希望这些请求对象相互影响。

您可以将所有请求类创建为密封的--并在代码中保留注释,以便对请求进行密封,并解释原因--但这可能是您所能做的一切,除了使用structs而不是类(如果只用于API请求,这可能不是个坏主意)。

查看在阶级和结构之间的选择,看看您的请求是否符合指南:

✓考虑定义一个结构,而不是一个类,如果该类型的实例很小且通常是短暂的,或者通常嵌入到其他对象中。 X避免定义结构,除非该类型具有以下所有特性:

  • 它在逻辑上表示一个值,类似于原语类型(int、double等)。
  • 它的实例大小小于16字节。
  • 它是不可改变的。
  • 它不需要经常装箱。

在所有其他情况下,您应该将类型定义为类。

票数 3
EN

Stack Overflow用户

发布于 2018-11-29 12:05:23

不,它不是。

顺便说一句,您不是继承接口,而是实现接口,也就是说,您只需为空方法提供实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53538642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档