3

考虑代码:

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

4 回答 4

3

稍微详细说明一下我的评论。这不受支持,所以答案是否定的。唯一想到的尝试这个的人为方法(这显然行不通)是有一个sealed abstract类,这是荒谬的,因为AnorB或其他任何东西都不能继承。

例如,没有任何鉴别器可以让我们说“密封”。

于 2013-07-02T12:51:10.820 回答
2

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

public sealed abstract class A
{
}

但你会得到编译错误:

抽象类不能声明为密封的。

这样做的原因是,对抽象类进行标记和限制其继承树根本没有任何意义。抽象类一个实体,其目标是由某人根据其定义进行扩展。

于 2013-07-02T12:50:35.313 回答
1

据我所知,您可以做的最接近的事情如下:

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

然后将AB、 和移动Base到他们自己的程序集中。程序集之外的任何东西都可以看到Base,但不能直接扩展它,因为它无法访问构造函数。

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

public abstract class Base
{
   protected Base()
   {
      if (!(this is A || this is B))
         // throw an exception
   }
}
于 2013-07-02T13:01:06.087 回答
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 可见。

免责声明:这很复杂,我不会推荐它,但我想不出任何方法来满足您的限制。

于 2013-07-02T14:33:48.287 回答