在接口中指定允许的子类

时间:2012-09-04 15:09:42

标签: c# inheritance syntax

有没有办法为接口指定允许的子类?

假设我有这些课程:

public interface IDoable // specify that only A or it's subclasses can implement IDoable
{
    void Do();
}

public class A : IDoable
{
    public void Do(){};
    public void Foo(){};
}

public class B : IDoable // implementing IDoable on something other than A or its sublcasses doesn't make any sense
{
    // public void Do();
}

所以稍后我将能够做到这一点:

IDoable d = new A();
d.Do();
d.Foo(); // I'd like to be able to do this.

C#是否支持这种功能?

3 个答案:

答案 0 :(得分:3)

不,它没有。接口表示合同,任何有权访问它的类都可以实现它。

您当然可以通过设置internal来限制对它的访问(因此只有相同的程序集才能访问它)。

答案 1 :(得分:2)

您可以投射 dA,以便能够在其上调用Foo

((A)d).Foo();

请注意,如果d不是A,则会引发异常。

其他选项是使用isas运算符测试d的类型。

这当然违背了使用界面开始的目的。

答案 2 :(得分:2)

  

有没有办法为接口指定允许的子类?

不,任何类都可以实现一个接口,只要它可以访问它。界面的重点是隐藏具体的类型/实现来自它的消费者,所以对我而言,以你的建议方式将它结合起来是没有意义的。