考虑代码:
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
的类(在同一程序集中),强制它们继承A
或B
?
答案 0 :(得分:3)
详细说明我的评论。这是不受支持的,所以答案是否定的。我想到的唯一人为尝试的方法(显然不会起作用)就是拥有一个sealed abstract
类,这个类是无意义的,既不是A
也不是B
,也不是其他任何东西,都可以继承。
例如,没有歧视者允许我们说“密封”。
答案 1 :(得分:2)
防止继承的唯一方法是声明类密封。
public sealed abstract class A
{
}
但是你会遇到编译错误:
抽象类不能声明为密封。
这样做的原因是简单地在判断抽象类和限制其继承树时没有任何意义。 Abstact类是一个实体,目标是由某人按其定义进行扩展。
答案 2 :(得分:1)
据我所知,你能做的最接近的事情如下:
public abstract class Base
{
internal Base()
{
// do stuff
}
}
然后将A
,B
和Base
移动到自己的程序集中。程序集外部的任何内容都可以看到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可见。
免责声明:这是非常令人费解的,我不会推荐它,但我想不出任何方法来满足你的约束。