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

实现继承同一基接口的多接口时的属性独立实现问题问询

解决方法

你的问题出在显式接口实现的语法错误——显式实现接口成员时不能加public修饰符,C#规定显式实现的成员默认是私有的,只能通过接口类型访问。

正确的实现方式如下:

public class Implementation : IDoSomething1, IDoSomething2
{
    // 显式实现IDoSomething1的BaseBool,无需访问修饰符
    IReadOnlyReactiveProperty<bool> IDoSomething1.BaseBool { get; }
    // 显式实现IDoSomething2的BaseBool
    IReadOnlyReactiveProperty<bool> IDoSomething2.BaseBool { get; }

    // 构造函数中初始化两个独立的属性实例
    public Implementation()
    {
        ((IDoSomething1)this).BaseBool = new ReactiveProperty<bool>();
        ((IDoSomething2)this).BaseBool = new ReactiveProperty<bool>();
    }

    // 可选:用私有字段代理,方便类内部直接操作属性
    private readonly ReactiveProperty<bool> _doSomething1Bool = new();
    private readonly ReactiveProperty<bool> _doSomething2Bool = new();

    // 用私有字段代理显式实现的属性,简化内部访问
    IReadOnlyReactiveProperty<bool> IDoSomething1.BaseBool => _doSomething1Bool;
    IReadOnlyReactiveProperty<bool> IDoSomething2.BaseBool => _doSomething2Bool;
}

关键说明

  • 当你把Implementation实例转换为IDoSomething1或IDoSomething2类型时,会分别访问对应的独立BaseBool实现,完全满足区分两个接口订阅的需求。
  • 如果需要在类内部操作这两个属性,推荐用私有字段做代理,避免频繁的类型转换。
  • 外部代码只能通过接口类型访问这些显式实现的成员,示例:
    var impl = new Implementation();
    var bool1 = ((IDoSomething1)impl).BaseBool;
    var bool2 = ((IDoSomething2)impl).BaseBool;
    

这样修改后,当你查找所有IBase类型的接口实例时,就能正确区分来自IDoSomething1和IDoSomething2的不同BaseBool了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:23:17