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

C#是否支持限制基接口仅被其他接口继承,禁止类直接实现?

C# 是否支持禁止类直接实现基接口,仅允许通过派生接口实现?

C# 本身没有原生语法可以直接禁止类实现某个接口,但可以通过两种间接手段达成你想要的效果:

1. 接口访问权限控制 + 抽象基类约束

将基接口 IObject 的访问级别设为 internal(仅限当前程序集可见),同时提供公开的派生接口(IItem、IWeapon)和一个实现了 IObject 的抽象基类,强制业务类通过继承抽象基类并实现派生接口的方式来间接实现 IObject:

// 仅当前程序集可见,外部无法直接实现
internal interface IObject {
    Vector3 Position { get; }
}

// 公开的派生接口,对外暴露
public interface IItem : IObject {
    // IItem 专属成员定义
}

public interface IWeapon : IObject {
    // IWeapon 专属成员定义
}

// 抽象基类实现IObject,供业务类继承
public abstract class BaseObject : IObject {
    public abstract Vector3 Position { get; }
}

// 合法实现:继承BaseObject并实现IItem
public class HealingPotion : BaseObject, IItem {
    public override Vector3 Position { get; } = new Vector3(0, 0, 0);
    // 实现IItem的成员
}

// 合法实现:继承BaseObject并实现IWeapon
public class SteelSword : BaseObject, IWeapon {
    public override Vector3 Position { get; } = new Vector3(1, 1, 1);
    // 实现IWeapon的成员
}

这种方式下,外部程序集无法直接实现 IObject(因为接口是internal),同一程序集内如果有人直接实现 IObject,可以通过团队代码规范约束。同时你依然可以用 List<IObject> 来存储所有对象,实现多态。

2. 自定义Roslyn代码分析器

如果需要更严格的约束(包括同一程序集内也禁止直接实现 IObject),可以编写自定义的Roslyn分析器,添加规则:当类直接实现 IObject 时触发编译错误。这种方式可以在编译阶段就阻止违规代码,是最彻底的方案。

效果说明

  • 允许:类实现 IItem/IWeapon(因为它们继承自 IObject,间接满足接口要求)
  • 禁止:类直接实现 IObject(要么无法编译,要么被代码分析器拦截)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:09:21