[英]Prevent inheritance of base class
如果我有 3 个类如下:
abstract class A {}
public class B : A {}
public class C: A {}
我想强制其他代码直接使用 B 或 C ,或者从B
或C
继承。 我不希望其他代码直接从A
继承。
这甚至可能吗?
A
不能是私有的,因为B
和C
必须是公共的,使 A 私有会导致“不一致的可访问性”。 出于同样的原因, A
不能是internal
的。
我为什么要这个?
我设计了一个 API,它的响应必须包括属性 x,或两个属性 y 和 z,但不是全部 3。它还包括一堆其他属性,这些属性对这两种可能性都是通用的。 IE -
{
"allOf": [
{
"type": "object",
"properties": {
"w": { ... }
}
},
{
"anyOf": [
{
"type": "object",
"properties": {
"x": { ... }
}
},
{
"type": "object",
"properties": {
"y": { ... },
"z": { ... }
}
}
]
}
]
}
如果你让B
和C
的一部分A
你可以标记的构造A
private
所以没有其他的类可以直接继承A
:
public class A
{
private A()
{
}
public class B: A
{
public B()
{
}
}
public class C: A
{
public C()
{
}
}
}
然而,缺点是您现在必须将B
称为AB
(请参阅编辑,这不是必需的),但从功能上讲,应用程序的其余部分能够实例化和使用AB
和AC
类型的类并从它们继承,同时禁止直接实例化或使用A
的能力(即使在同一个文件/程序集中)。
所以这在A
之外的任何地方都是无效A
:
public class D: A
{
}
但这你可以在任何地方使用:
public class E : A.B
{
}
编辑:正如 Jonathan Barclay 所指出的,您可以通过以下 using 指令防止必须使用AB
,这将允许您正常继承:
using static MyNamespace.A;
public class D : B
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.