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
相关产品推荐
相关产品推荐

