实现含同名不同类型属性的两个接口时,如何解决冲突?
如何解决实现多接口时的属性名称冲突问题?
我需要实现来自不同库的两个接口,但这两个接口有个名称相同但类型不同的属性。当前代码如下:
public class Connection : IGraphObject, IPathFind { Node _node; // Node同时实现了两个接口 public INode NodeA => _node; // 来自IGraphObject接口 public IPathNode NodeA => _node; // 来自IPathFind接口 }
编译时触发错误:
Already contains definition
请问该怎么解决这个属性定义冲突?
解决办法:用显式接口实现
在C#里碰到这种同名接口成员冲突的情况,显式接口实现是最直接的解决方案。它能明确指定某个成员属于哪个接口,让编译器不会混淆。
修改后的代码示例:
public class Connection : IGraphObject, IPathFind { Node _node; // Node同时实现了两个接口 // 显式实现IGraphObject的NodeA属性 INode IGraphObject.NodeA => _node; // 显式实现IPathFind的NodeA属性 IPathNode IPathFind.NodeA => _node; }
补充说明
- 显式实现的成员默认是私有的,不能直接通过类实例访问,得先把实例转成对应的接口类型才能调用:
var conn = new Connection(); INode graphNode = ((IGraphObject)conn).NodeA; IPathNode pathNode = ((IPathFind)conn).NodeA; - 如果想让类实例直接访问其中一个属性,可以额外加个公共属性做包装:
public class Connection : IGraphObject, IPathFind { Node _node; INode IGraphObject.NodeA => _node; IPathNode IPathFind.NodeA => _node; // 公共属性,方便直接调用 public INode GraphNode => ((IGraphObject)this).NodeA; public IPathNode PathNode => ((IPathFind)this).NodeA; }
内容的提问来源于stack exchange,提问作者WDUK
相关产品推荐
相关产品推荐

