是否可以阻止抽象类的继承

时间:2013-07-02 12:47:52

标签: c# inheritance abstract-class

考虑代码:

public abstract class Base
{
   public Dictionary<int, string> Entities { get; private set; }

   protected Base()
   {
      Entities = new Dictionary<int, string>();
   }
}

public abstract class A : Base
{
   public abstract void Update();
}

public abstract class B : Base
{
   public abstract void Draw();
}

是否可以限制继承自Base的类(在同一程序集中),强制它们继承AB

4 个答案:

答案 0 :(得分:3)

详细说明我的评论。这是不受支持的,所以答案是否定的。我想到的唯一人为尝试的方法(显然不会起作用)就是拥有一个sealed abstract类,这个类是无意义的,既不是A也不是B,也不是其他任何东西,都可以继承。

例如,没有歧视者允许我们说“密封”。

答案 1 :(得分:2)

防止继承的唯一方法是声明类密封。

public sealed abstract class A
{
}

但是你会遇到编译错误:

  

抽象类不能声明为密封。

这样做的原因是简单地在判断抽象类和限制其继承树时没有任何意义。 Abstact类一个实体,目标是由某人按其定义进行扩展。

答案 2 :(得分:1)

据我所知,你能做的最接近的事情如下:

public abstract class Base
{
   internal Base()
   {
      // do stuff
   }
}

然后将ABBase移动到自己的程序集中。程序集外部的任何内容都可以看到Base,但不能直接扩展它,因为它无法访问构造函数。

或者您可以进行运行时检查:

public abstract class Base
{
   protected Base()
   {
      if (!(this is A || this is B))
         // throw an exception
   }
}

答案 3 :(得分:0)

我能想到的唯一解决方法就是:

A.DLL

internal abstract class Base
{
   public Dictionary<int, string> Entities { get; private set; }

   protected Base()
   {
      Entities = new Dictionary<int, string>();
   }
}

B.DLL

public abstract class A : Base
{
   public abstract void Update();
}

public abstract class B : Base
{
   public abstract void Draw();
}

C.dll

public class C : A
{
    public void Draw()
    {
    }
}

然后在A.dll的AssemblyInfo.cs中使用[assembly:InternalsVisibleTo ...]使内部类对B.ll可见。

免责声明:这是非常令人费解的,我不会推荐它,但我想不出任何方法来满足你的约束。