You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#接口访问修饰符困境:公共抽象类实现内部接口报错

解决C#公共抽象类实现内部接口的问题

这个问题的核心在于C#接口成员默认是公共可见的,但你的接口本身是internal(仅当前程序集可见),而公共抽象类又不能直接用internal修饰来实现接口方法——不过别担心,我们可以利用显式接口实现的特性来完美解决这个问题,同时保持接口和方法的内部可见性。

方案一:显式接口实现 + 内部抽象方法委托

这种方式让子类只需要实现内部抽象方法,不用关心接口的显式实现细节,代码更简洁易维护:

// 保持内部接口定义不变
internal interface Doable { void DoSomething(); }
internal interface Informable { void SomethingHappened(Doable obj); }

public abstract class MyAbstractClass : Doable, Informable
{
    // 显式实现接口方法——外部程序集看不到这些方法(因为接口是internal)
    void Doable.DoSomething()
    {
        // 委托给内部抽象方法,让子类实现具体逻辑
        DoSomethingInternal();
    }

    void Informable.SomethingHappened(Doable obj)
    {
        SomethingHappenedInternal(obj);
    }

    // 定义内部抽象方法,仅当前程序集内的子类可见并需要实现
    internal abstract void DoSomethingInternal();
    internal abstract void SomethingHappenedInternal(Doable obj);

    // 其他公共/内部方法
}

// 程序集内的子类实现示例
internal class MyConcreteClass : MyAbstractClass
{
    internal override void DoSomethingInternal()
    {
        // 具体实现逻辑
        Console.WriteLine("Doing something...");
    }

    internal override void SomethingHappenedInternal(Doable obj)
    {
        // 具体实现逻辑
        Console.WriteLine("Something happened to the doable object.");
    }
}

方案二:直接将显式接口实现标记为abstract

这种方式更直接,直接把接口的显式实现定义为抽象方法,要求子类必须显式实现接口成员:

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

public abstract class MyAbstractClass : Doable, Informable
{
    // 显式实现接口并标记为abstract,子类必须实现这些方法
    abstract void Doable.DoSomething();
    abstract void Informable.SomethingHappened(Doable obj);

    // 其他公共/内部方法
}

// 程序集内的子类实现示例
internal class MyConcreteClass : MyAbstractClass
{
    // 子类必须显式实现接口方法
    void Doable.DoSomething()
    {
        // 具体实现
    }

    void Informable.SomethingHappened(Doable obj)
    {
        // 具体实现
    }
}

效果说明

两种方案都能满足你的需求:

  • 外部程序集无法看到Doable和Informable接口,因此即使MyAbstractClass是公共的,外部也完全感知不到它实现了这些接口,更无法调用相关方法。
  • 程序集内部的子类可以正常实现所需的逻辑,完全符合内部可见性的要求。

内容的提问来源于stack exchange,提问作者Najeeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:30