接口访问修饰符困境

问题描述 投票:3回答:2

在我的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访问修饰符)。

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

想知道怎么回事?

c# interface abstract-class access-modifiers
2个回答
5
投票

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


-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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.