繁体   English   中英

防止继承基类

[英]Prevent inheritance of base class

如果我有 3 个类如下:

abstract class A {}

public class B : A {}

public class C: A {}

我想强制其他代码直接使用 B 或 C ,或者从BC继承。 我不希望其他代码直接从A继承。

这甚至可能吗?

A不能是私有的,因为BC必须是公共的,使 A 私有会导致“不一致的可访问性”。 出于同样的原因, A不能是internal的。

我为什么要这个?

我设计了一个 API,它的响应必须包括属性 x,或两个属性 y 和 z,但不是全部 3。它还包括一堆其他属性,这些属性对这两种可能性都是通用的。 IE -

{
  "allOf": [
    {
      "type": "object",
      "properties": {
        "w": { ... }
      }
    }, 
    {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "x": { ... }
          }
        }, 
        {
          "type": "object",
          "properties": {
            "y": { ... },
            "z": { ... }
          }
        }
      ]
    }
  ]
}

如果你让BC的一部分A你可以标记的构造A private所以没有其他的类可以直接继承A

public class A
{
    private A()
    {

    }

    public class B: A
    {
        public B()
        {

        }
    }

    public class C: A
    {
        public C()
        {

        }
    }
}

然而,缺点是您现在必须将B称为AB (请参阅编辑,这不是必需的),但从功能上讲,应用程序的其余部分能够实例化和使用ABAC类型的类并从它们继承,同时禁止直接实例化或使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM