实现继承同一基接口的多接口时的属性独立实现问题问询
解决方法
你的问题出在显式接口实现的语法错误——显式实现接口成员时不能加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
相关产品推荐
相关产品推荐

