接口访问修改器困境

时间:2018-01-03 14:29:43

标签: c# interface abstract-class access-modifiers

在我的C#程序中,我有几个我自己的界面,我希望保留在我的程序集内部。

internal interface Doable {
    void DoSomething ();
}

internal interface Informable {
    void SomethingHappened (Doable obj);
}

我有一个抽象类,它不能是内部的,它抽象地实现了这两个接口。

public abstract class MyAbstractClass : Doable, Informable {
    internal abstract void DoSomething ();
    internal abstract void SomethingHappened (Doable obj);

    // Other methods
}

但是,当我执行此操作时,出现MyAbstractClass未实现Doable.DoSomething()(以及SomethingHappened(Doable obj))的错误。

我可以将抽象实现的DoSomething()的访问修饰符更改为public(不过我首先想要的),但是SomethingHappened(Doable obj)是另一回事:它抱怨(正确地说)接口Doable是内部的(因此这个方法可能没有public访问修饰符)。

我处于两难境地。我基本上希望将两个接口及其所有具体实现的方法保存在内部程序集中的所有类中,而外部调用者并不知道它们的存在。

想知道如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

不是将接口实现抽象化,而是提供一个具体的(显式接口)实现,该实现调用实际完成工作的内部抽象方法。这确保了界面不能公开调用;它只能从当前的程序集中访问。

答案 1 :(得分:-1)

您应该使用显式实现;

internal interface IDoable
{
    void DoSomething();
}

internal interface Informable
{
    void SomethingHappened(IDoable obj);
}
public class MyClass : IDoable, Informable
{
    void IDoable.DoSomething()
    {
        throw new NotImplementedException();
    }

    void Informable.SomethingHappened(IDoable obj)
    {
        throw new NotImplementedException();
    }
}