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

C#中IRemoveInfinite接口IsCompleted属性实现合法性问题求助

解决C#接口无法包含实现且强制IRemoveInfinite的IsCompleted永远返回false的问题

首先得明确你原来的代码不合法的原因:C#接口只能定义成员签名,不能包含任何实现逻辑,所以IRemoveInfinite里直接写bool IsCompleted { get { return false; } }是不允许的。接下来我会给出两种可行的解决方案,其中第一种是更可靠的推荐方案。

方案一:抽象基类强制约束(推荐)

这个方案通过抽象基类封装IsCompleted的固定行为,同时让子类只需要专注实现核心的Remove方法:

// 基础移除接口,定义核心成员
public interface IRemove<out T>
{
    T Remove();
    bool IsCompleted { get; }
}

// 无限移除接口,仅继承IRemove,无需额外定义
public interface IRemoveInfinite<out T> : IRemove<T>
{
}

// 抽象基类,强制实现IRemoveInfinite的IsCompleted返回false
public abstract class RemoveInfiniteBase<T> : IRemoveInfinite<T>
{
    // 子类必须实现具体的移除逻辑
    public abstract T Remove();

    // 密封属性,确保子类无法重写,永远返回false
    public sealed bool IsCompleted => false;
}

为什么这个方案有效?

  • IsCompleted被标记为sealed,子类完全无法重写这个属性的行为,彻底杜绝了被改成true的可能。
  • 子类只需要实现Remove方法即可,无需关心IsCompleted的逻辑,减少重复代码。
  • 如果想进一步强制所有IRemoveInfinite的实现都必须继承这个基类,可以用Roslyn分析器写一个自定义规则,禁止直接实现IRemoveInfinite接口(只能通过继承基类来实现)。

方案二:显式接口实现(仅作备选)

如果你不想引入抽象基类,可以用显式接口实现来固定IsCompleted的行为,但这种方式约束性较弱,因为实现类仍有可能自行定义IsCompleted属性打破规则:

public interface IRemove<out T>
{
    T Remove();
    bool IsCompleted { get; }
}

public interface IRemoveInfinite<out T> : IRemove<T>
{
}

// 实现类,通过显式接口实现固定IsCompleted的返回值
public class InfiniteItemRemover<T> : IRemoveInfinite<T>
{
    public T Remove()
    {
        // 这里写你的无限移除逻辑
        return default(T);
    }

    // 显式实现IRemove的IsCompleted,返回false
    bool IRemove<T>.IsCompleted => false;
}

注意点:

这种方式下,如果实现类额外定义了一个public bool IsCompleted { get; },就会隐藏接口的成员,导致外部调用时可能拿到错误的返回值,所以不如方案一可靠。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:52:55